q = input ("enter(1-51) or (q to quit):")
while q != 'q' and int (q) < 1 or int (q) > 51:
q = input ("enter(1-51) or (q to quit):")
我得到以下错误,我也尝试在变量周围使用str()
也得到了同样的错误,还建议我如何使用类似于上述的东西执行退出游戏或游戏中回合的技术如果不是最好的方法。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'q'
解决方法:添加括号:
q = input ("enter(1-51) or (q to quit):")
while q != 'q' and (int (q) < 1 or int (q) > 51):
# brackets here ^ and here ^
q = input ("enter(1-51) or (q to quit):")
如果没有括号,如果第一个条件为 False,它将始终尝试or int (q) > 51
。(所以当q == 'q'
( 但是,使用括号,它在q == 'q'
时不会进一步评估,因此您不必担心引发错误。 另一方面,您仍然无法免受其他无效输入的影响:
enter(1-51) or (q to quit):hello
Traceback (most recent call last):
File "/Users/Tadhg/Documents/codes/test.py", line 2, in <module>
while q != 'q' and (int (q) < 1 or int (q) > 51):
ValueError: invalid literal for int() with base 10: 'hello'
因此,您还可以在int
转换之前添加另一个检查,以确保所有字符都是数字(.isdigit()
(:
while q !='q' and not (q.isdigit() and 1<=int(q)<=51):
你的程序几乎是正确的。这是修复:
while q != 'q' and (int (q) < 1 or int (q) > 51):
通常,and
的优先级高于 or
。因此,您的原始代码将被解释为:
while (q != 'q' and int (q) < 1) or int (q) > 51:
但这种解释会导致错误的行为。因为如果q == 'q'
,那么!=
是假的,and
子句是假的,所以or
后面的第三个子句被评估。这会导致int(q)
被评估,从而导致异常。