我这里的代码有问题,但我知道问题是什么。成绩有2个字,所以显示2个结果,每个结果加0.3。这是一个问题,因为应该只将一个结果打印到控制台。

keydict = {'A': 4.0,'B': 3.0,'C': 2.0,'D': 1.0,'F': 0, '+': 0.3, '-': -0.3}
grade = input('Grade:')


def letter2number(letter):
    if len(grade) > 2:
        print('Too many characters')
        letter2number(grade)
    for char in grade:
        if char in keydict:
            if '+' in grade:
                print(keydict[char] + keydict['+'])
            elif '-' in grade:
                print(keydict[char] + keydict['-'])
            else:
                print(keydict[char])
        else:
            print(grade,'is an invalid input')
    return


letter2number(grade)

这是在用户输入“A+”(或任何带有“+”或“-”的等级)后打印到屏幕上的内容我意识到 for 循环导致了这个问题,因为输入中有 2 个字符。但我不认为有另一种方法可以在不使用 for 循环的情况下做到这一点。 4.3 是预期的,0.6 不是我想要的。
Grade: A+ # <<< Thats a user input
4.3       # <<< YES
0.6       # <<< How can I get this to NOT print

除了打印 0.6 之外,我对代码没有其他问题。换句话说,我不想要 0.6,但 4.3 应该保留。

最佳答案

您的 for 循环在这里是不必要的,这会导致您的问题。请记住,for 循环将独立查看两个字符

"A"  # evaluates to 4.0, add 0.3 since '+' exists in the string
"+"  # evaluates to 0.3, add 0.3 since '+' exists in the string

这绝对不是你想要的。你应该做的是:
def lettertograde(letter):
    letter, *modifier = letter
    grade = keydict[letter]
    if "+" in modifier:
        grade += 0.3
    elif "-" in modifier:
        grade -= 0.3
    return grade

这个 a, *b = ... 语法是 splat 解包,它的工作原理是从迭代中提取部分,如下所示:
a, *b = "A"          # a = "A", b = []
a, *b = "A+"         # a = "A", b = ["+"]
a, *b = "A-"         # a = "A", b = ["-"]
a, *b = "Good job!"  # a = "G", b = ["o", "o", "d", " ", "j", "o", "b", "!"]
a, *b = ""           # ValueError("not enough values to unpack (expected at least 1, got 0)")

注意同一表达式中的多个 splats 会引入歧义,这是不允许的。
a, *b, c, *d = "anything"  # SyntaxError("two starred expressions in assignment")

关于python - 我怎样才能只打印 1 个结果而不是两个结果都打印到控制台?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47705520/

10-10 08:05