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
. Как всегда, скобки могут быть использованы для выражения желаемого приоритета в операциях.
Логические операции, упорядоченные по приоритету выполнения:
not x
- если x
ложно, то возвращается True
, иначе False
.x and y
- если x
ложно, то возвращается x
, иначе у
.x or y
- если x
ложно, то возвращается у
, иначе x
Также смотрите встроенные функции all()
и any()
and
:a = 'a' b = 'b' c = 'c' >>> a and b # 'b' >>> '' and b # '' >>> a and b and c # 'c'
Пояснения к примеру выше с оператором and
:
and
вычисляет значения в булевом контексте слева направо. Значения 0
, ''
, []
, ()
, {}
и None
являются ложью, все остальное является истиной. Если у and
оба операнда являются истиной, результатом будет последнее значение.''
- пустая строка, первое значение которое является ложью.c
.or
:a = 'a' b = 'b' >>> a or b # 'a' >>> '' or b # 'b' >>> '' or [] or {} # {} >>> def func(): ... return 1 >>> a or func() # 'a'
Пояснения к примеру выше с оператором or
:
or
вычисляет значения в булевом контексте слева направо. Если операнд является истиной, or
немедленно возвращает результат. В данном случае a
, первое истинное значение.or
вычисляет выражение ''
, которое является ложью, затем b, которое является истиной, и возвращает его значение.or
возвращает последнее.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'