i = 200
j = 201
if i == 200 | j == 201:
print "Hi"
else:
print "No"
Должен ли он напечатать «Привет», правильно? Так почему он печатает «Нет»?Несколько условий в Python, если оператор
i = 200
j = 201
if i == 200 | j == 201:
print "Hi"
else:
print "No"
Должен ли он напечатать «Привет», правильно? Так почему он печатает «Нет»?Несколько условий в Python, если оператор
В Python |
и &
являются побитовыми операторами, они выполняют битовые вычисления.
С другой стороны, and
и or
являются логическими (булевыми) операторами.
| поразрядный операторы и в питоном скрипте делать битовые вычисления Используйте этот
i = 200
j = 201
if i == 200 or j == 201:
print "Hi"
else:
print "No"
Проблему здесь на самом деле один из старшинства операторов, конкретно не использовать побитовые |
, а не логический or
; True | True
и True or True
дают тот же результат.
Пер в Python docs приведено сравнение ==
имеет более низкий приоритет, чем побитового |
, поэтому ваше условное выражение вычисляемая:
i == (200 | j) == 201
, который является ложным. Если вы добавили круглые скобки, чтобы уточнить:
(i == 200) | (j == 201)
вы получите ожидаемое поведение.
Однако правильное, что нужно сделать, это использовать or
. Использование or
работает, потому что без круглых скобок, потому что булевы операторы имеют более низкий приоритет, чем сравнения. Дополнительно:
TypeError
На языке сценариев следует также рассмотреть обработку« Нет ». 'True или None' не генерирует исключение,' (True | None) 'throws' TypeError'. 'True и None' равно' None', но будет действовать так же, как 'False' в выражении' if'. – nigel222
Рассмотрите также оценки функций. Python 'и' или' or' используют логику короткого замыкания, поэтому 'f() или g()' вызывает 'f', но не вызывает' g', если 'f' возвращает True или« правдиво ». 'g() или f()' вызывает 'g', но не' f', когда 'g' возвращает true. '(f() | g())' всегда будет вызывать как 'f', так и' g'. Это становится очень важным, когда 'f' или' g' - это методы экземпляров класса, которые влияют на состояние экземпляра при вызове. – nigel222
@ nigel222 Да, определенно правильно использовать 'или', но это не значит, что код OP не работал должным образом. Я сделаю это более ясным. – jonrsharpe
Заметим, что 'если (я == 200) | (j == 201): 'будет делать то, что вы ожидаете ... – jonrsharpe