Сообщить об ошибке.

Логические операции and, or и not.

Синтаксис:

x or y
x and y
not x

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

  • or - оценивает второй аргумент, только если первый равен False. Если какой либо операнд в цепочке or является истиной, немедленно возвращается результат - первое истинное значение.
  • and - оценивает второй аргумент, только если первый равен True. Если в цепочке and все операнды являются истиной, результатом будет последнее значение. А если какой-либо из операндов является False, результатом будет первое ложное значение.
  • not имеет более низкий приоритет, чем операторы сравнения, так not a == b интерпретируется как not (a == b), а выражение a == not b вовсе является синтаксической ошибкой. Единственный логический оператор с одним аргументом. Он принимает один аргумент x и возвращает противоположный результат: False для истинного значения и True для ложного значения.

Операторы and и or не приводят свои результаты принудительно к значениям True или False, а возвращают один из своих операндов. Такой подход позволяет использовать эти операторы в более общих, а не только булевых операциях. Если другие операторы, прежде чем выполнить операцию, вычисляют все свои операнды, то в случае операторов and и or с их семантикой закорачивания необходимость вычисления правого операнда определяется результатом вычисления левого.

Из булевых операторов, not имеет самый высокий приоритет, а or самый низкий, так что A and not B or C эквивалентно (A and (not B)) or C. Как всегда, скобки могут быть использованы для выражения желаемого приоритета в операциях.

Логические операции, упорядоченные по приоритету выполнения:

  1. not x - если x ложно, то возвращается True, иначе False.
  2. x and y - если x ложно, то возвращается x, иначе у.
  3. x or y - если x ложно, то возвращается у, иначе x

Так же смотрите встроенные функции all() и any()

Пример c and:

a = 'a'
b = 'b'
c = 'c'

>>> a and b
# 'b'

>>> '' and b
# ''

>>> a and b and c
# 'c'

Пояснения к примеру выше с оператором and:

  1. Оператор and вычисляет значения в булевом контексте слева направо. Значения 0, '', [], (), {} и None являются ложью, все остальное является истиной. Если у and оба операнда являются истиной, результатом будет последнее значение.
  2. Если какой-либо из операндов является ложью, результатом будет первое такое значение. В данном случает это '' - пустая строка, первое значение которое является ложью.
  3. Все значения являются истиной, так что в результате мы получаем последнее c.

Пример c or:

a = 'a'
b = 'b'

>>> a or b
# 'a'

>>> '' or b
# 'b'

>>> '' or [] or {}
# {}

>>> def func():
...        return 1
>>> a or func()
# 'a'

Пояснения к примеру выше с оператором or:

  1. Оператор or вычисляет значения в булевом контексте слева направо. Если операнд является истиной, or немедленно возвращает результат. В данном случае a, первое истинное значение.
  2. or вычисляет выражение '', которое является ложью, затем b, которое является истиной, и возвращает его значение.
  3. Если все значения являются ложью, or возвращает последнее.
  4. Обратите внимание, что or вычисляет операнды до тех пор, пока не найдет истинное значение, остальное игнорируется. Это имеет значение, когда вычисление операнда дает сторонние эффекты. В данном случае функция func() не вызывается, так как для получения результата выражения с оператором or достаточно того, что первый операнд a является истиной.

Другие примеры с and и or:

>>> a = 'one'
>>> b = 'two'
>>> 1 and a or b
# 'one'
>>> 0 and a or b
# 'two'


>>> a = ''
>>> b = 'two'
# 'a' - пустая строка, которую Python считает ложью,
# следовательно 1 and '' дает '', а '' or 'two' дает 'two'.
>>> 1 and a or b
# 'two'