2016-05-18 2 views
-1
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' 

ответ

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

Без скобок он всегда будет пытаться 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): 
+0

благодаря Q = вход ("ввести (1- 51) или (q to quit): ") \t, в то время как q! = 'Q' и (q.isdigit() и (int (q) <1 или int (q)> 51)): \t \t q = ввод ("введите (1-51) или (q to quit): ") – Samir

+0

, который все еще не имеет правильной логики, когда' q.isdigit() 'False (как в недопустимом числе), цикл while прерывается! –

+0

вам нужно будет изменить 'not (q.isdigit() и' to be '(не q.isdigit() или' –

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 является ложным, поэтому вычисляется третье предложение после or. Это вызывает оценку int(q), что вызывает исключение.

+0

благодаря Nayuki, он исправил мою проблему, и сегодня я узнал, что и получает оценку до или (у ) – Samir

+0

имеет смысл, так как и есть умножение в то время как OR является сложение – Samir