Вопрос по python – ИЛИ поведение в питоне:

2

Я написал следующий фрагмент кода, все, что я хочу сделать, это напечатать yes для, если переданное число является строковым представлением 1, 0 или 2 и для всего остального false:

<code>number=raw_input()
if number is "1" or "0" or "2":
    print "Yes"
else:
     print "no"
</code>

Я знаю, как заставить задуманную логику работать, но я просто хочуneed чтобы знать, почему он печатает да для любого числа, которое я передаю raw_input. Мне бы хотелось, чтобы ответ был как можно более подробным, потому что я не могу понять, почему он потерпит неудачу.

Ваш Ответ

3   ответа
3

if number == "1" or number == "0" or number == "2":
    print "Yes"

Или тем более Pythonic:

if number in ["1", "2", "3"]:
    print "Yes"

Или вы можете бросить наint и попробовать:

if int(number) in range(1,4):
    print "Yes"

Причина, по которой ваш код оценивается какTrue все время, потому что он оценивает правду"0" а также"2", которые как утверждения верны в Python.

Обратите внимание, что использование списка для этого является плохой идеей - хотя в этом случае с небольшим набором проверок это не имеет значения, проверка на членство в списке выполняется медленнее, поэтому имеет смысл использовать наборы. Также стоит отметить, что ваш последний пример будет генерировать исключения, если входные данные могут быть чем-то, что не является числом.
Я знал о возможном исключении, но не о снижении производительности при проверке членства в списке. Спасибо за чаевые!
5

if (number is "1") or "0" or "2":

И как любая непустая строка оценивается какTrueэто всегдаTrue.

Чтобы сделать то, что вы хотите, хороший синтаксис:

if number in {"1", "0", "2"}:

Обратите внимание, что я здесь использую набор - хотя в этом случае (только с тремя значениями) это не имеет большого значения, проверка набора выполняется быстрее, чем список, поскольку тест на членство для набора - O (1) вместо O (п).

Это просто приятнее и проще написать это:

if number == "1" or number == "0" or number == "2":

Что ты и хотел.

Обратите внимание, что при сравнении значений вы всегда должны использовать== неis - is это проверка идентичности (два значения являются одним и тем же объектом). Как правило, вы должны использоватьis для таких вещей, какis True или жеis None.

Если вы хотите обработать это как число, вы можете сделать что-то вроде этого:

try:
   value = int(number)
except ValueError:
   value = None
if value is not None and 0 <= value <= 2:
    ...

Что может быть более полезно в ситуациях, когда вы хотите сравнить с большим диапазоном чисел. Обратите внимание, что я использую полезную цепочку сравнения Python (0 <= value <= 2 скорее, чем0 <= value and value <= 2).

Error: User Rate Limit Exceededis.
Error: User Rate Limit Exceeded Thuita Wachira
0

or оценивается как логическое выражение.

if True оценивается как True,if 1: оценивается как True,if "0": оценивается как True.

То, что вы написали, более или менее эквивалентно:

if number is "1":
    print "Yes"
elif "0":
    print "Yes"
elif "2":
    print "Yes"
else:
     print "no"

Вы должны были написатьif number is "1" or number is "0" or number "2": или, более питонический:if number in ("1", "0", "2"):

Похожие вопросы