2017-02-07 6 views

ответ

0

В Python | и & являются побитовыми операторами, они выполняют битовые вычисления.

С другой стороны, and и or являются логическими (булевыми) операторами.

0

| поразрядный операторы и в питоном скрипте делать битовые вычисления Используйте этот

i = 200 

j = 201 

if i == 200 or j == 201: 
    print "Hi" 
else: 
    print "No" 
2

Проблему здесь на самом деле один из старшинства операторов, конкретно не использовать побитовые |, а не логический or; True | True и True or True дают тот же результат.

Пер в Python docs приведено сравнение == имеет более низкий приоритет, чем побитового |, поэтому ваше условное выражение вычисляемая:

i == (200 | j) == 201 

, который является ложным. Если вы добавили круглые скобки, чтобы уточнить:

(i == 200) | (j == 201) 

вы получите ожидаемое поведение.


Однако правильное, что нужно сделать, это использовать or. Использование or работает, потому что без круглых скобок, потому что булевы операторы имеют более низкий приоритет, чем сравнения. Дополнительно:

  • это более удобным для чтения, так как это естественный язык, чтобы выразить то, что вы имеете в виду
  • Это короткое замыкание, так что если левая рука truthy правая рука не должна быть оценивали
  • он работает в более широком диапазоне сценариев, где операция поразрядного бы TypeError
+0

На языке сценариев следует также рассмотреть обработку« Нет ». 'True или None' не генерирует исключение,' (True | None) 'throws' TypeError'. 'True и None' равно' None', но будет действовать так же, как 'False' в выражении' if'. – nigel222

+0

Рассмотрите также оценки функций. Python 'и' или' or' используют логику короткого замыкания, поэтому 'f() или g()' вызывает 'f', но не вызывает' g', если 'f' возвращает True или« правдиво ». 'g() или f()' вызывает 'g', но не' f', когда 'g' возвращает true. '(f() | g())' всегда будет вызывать как 'f', так и' g'. Это становится очень важным, когда 'f' или' g' - это методы экземпляров класса, которые влияют на состояние экземпляра при вызове. – nigel222

+0

@ nigel222 Да, определенно правильно использовать 'или', но это не значит, что код OP не работал должным образом. Я сделаю это более ясным. – jonrsharpe

Смежные вопросы