我想要选择退出或接受特定范围的值

时间:2016-05-18 20:20:07

标签: python-3.x user-input boolean-expression

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'

2 个答案:

答案 0 :(得分:1)

非常简单的修复:添加括号:

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

答案 1 :(得分:0)

你的程序几乎是正确的。这是修复:

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子句为false,因此评估or之后的第三个子句。这会导致int(q)被评估,从而导致异常。