Python 如何仅将一个结果打印到控制台,而不同时将两个结果打印到控制台?

Python 如何仅将一个结果打印到控制台,而不同时将两个结果打印到控制台?,python,python-3.x,Python,Python 3.x,我这里的代码有问题,但我知道问题是什么。等级中有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

我这里的代码有问题,但我知道问题是什么。等级中有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

Grade:A+#如果keydict:

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])

            break  # <<---

        else:
            print(grade,'is an invalid input')
    return


letter2number(grade)
keydict={'A':4.0,'B':3.0,'C':2.0,'D':1.0,'F':0',+':0.3',-':-0.3}
等级=输入('等级:')
def字母2编号(字母):
如果长度(等级)>2:
打印('字符太多')
字母2编号(等级)
对于等级中的字符:
如果keydict中有字符:
如果等级为“+”:
打印(keydict[char]+keydict['+'])
级别中的elif“-”:
打印(keydict[char]+keydict['-'])
其他:
打印(keydict[char])

中断#您的
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解包,通过从iterable中拉出部分来工作,如下所示:

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)")
注意:同一表达式中的多个SPlat会产生歧义,这是不允许的

a, *b, c, *d = "anything"  # SyntaxError("two starred expressions in assignment")

生成修改后的成绩并将其添加到词典中。然后查找整个年级字符串

>>> keydict = {'A': 4.0, 'B': 3.0, 'C': 2.0, 'D': 1.0, 'F': 0}
>>> modifiers = {'+': 0.3, '-': -0.3}
>>> keydict.update({ k + mk: v + mv for k, v in keydict.items() for mk, mv in modifiers.items() })
>>> keydict
{'D': 1.0, 'F+': 0.3, 'A+': 4.3, 'F': 0, 'F-': -0.3, 'C+': 2.3, 'B': 3.0, 'C': 2.0, 'D-': 0.7, 'C-': 1.7, 'B-': 2.7, 'D+': 1.3, 'B+': 3.3, 'A-': 3.7, 'A': 4.0}
>>> grade = 'C-'
>>> keydict[grade]
1.7
B 3.0 香蕉是无效的输入
B-2.7

问题写得很好。作为一个学习Python的人,为什么需要在这里休息一下?难道它不会完成这个功能吗?它在哪里打印第二个值?啊,我想你已经明白了。但是有了中断,它不会返回
4.0
,也不会返回所需的
4.3
为什么需要在这里中断?
-
中断
中断循环
难道它不会完成函数吗?
-
break
不会完成函数,只是停止循环并继续执行其余代码<代码>它在哪里打印第二个值?-您的意思是,在iTadreik的情况下,为什么代码会生成第二个值
但是如果中断,它不会返回4.0而不是期望的4.3吗?
-函数将返回4.3,因为
如果等级中的“+”:print(keydict[char]+keydict['+'))
@Tom,iTadreik的代码会打印第二个值(0.6),因为他为等级中的char:->实现了一个循环
等级中有2个char
A
+
)。循环处理每个字符,在循环的第二次迭代(当循环处理
+
时)块
如果等级为“+”:
执行
打印(keydict[char]+keydict['+')
(当
char
这里是
+/code>)。这就是为什么第二个结果是0.6。是的,明白了-他们实际上不需要循环谢谢这个例子!从来没有想过关于字符串的
a,*b
技术:)我是python初学者,不知道*modifier,谢谢。@iTadreik注意
modifier
只是变量的名称。神奇之处在于
*
>>> keydict = {'A': 4.0,'B': 3.0,'C': 2.0,'D': 1.0,'F': 0, '+': 0.3, '-':    0.3, ' ': 0.0}
>>> grade = input('Grade:') + ' '
>>> if grade[0] in keydict and grade[1] in keydict:
       print(grade, keydict[grade[0]]+ keydict[grade[1]])
    else:
       print(grade, 'is an invalid input')