В глубь языка Python


Особенности операторов and и or - часть 2


является истиной, b, если bool

ложно. Благодаря особенностям работы операторов and и or

в Python, вы можете достигнуть анологичного эффекта.

Пример 2.18. Прием с and-or

>>> a = "first" >>> b = "second" >>> 1 and a or b

1

'first' >>> 0 and a or b

2

'second'

Синтаксис bool ? a : b в языке Python выглядит похоже. Все выражение вычисляется слева направо, так что оператор and применяется первым. 1 and 'first' дает 'first', затем 'first' or 'second' дает 'first'.
0 and 'first' дает 0, тогда 0 or 'second' дает 'second'.

Однако, так как такое выражение выполняет обычные логические операции, а не является специальной конструкцией языка, существует очень важная разница между приемом с and-or в языке Python и конструкцией bool ? a : b в C. Если значение a является ложью, это прием не будет работать так как вы могли ожидать. (Вы можете сказать, что обожгись на этом? Более одного раза?)

Пример 2.19. Когда прием с and-or не работает

>>> a = "" >>> b = "second" >>> 1 and a or b

1

'second'

Так как a — пустая строка, которую Python считает ложью в булевом контексте, 1 and '' дает '', а '' or 'second' дает 'second'. Ой! Это не то, что мы хотели получить.
Важно
Прием с and-or, bool and a or b, не будет работать так же, как конструкция bool ? a : b в C, если a является ложью.

Для безопасного использования приема с and-or необходимо сделать так, чтобы a всегда было истинным. Один из самых распространенных способо это сделать — заменить a на [a] и b на [b], тогда первый элемент получаемого списка будет либо a, либо b.

Пример 2.20. Безопасное использование приема с and-or

>>> a = "" >>> b = "second" >>> (1 and [a] or [b])[0]

1

''

Так как выражение [a] является непустым списком, оно никогда не будет ложно. Даже если a

равно 0, '' или другому значению, являющемуся ложью, список [a] всегда будет являться истиной, потому что содержит один элемент.




Начало  Назад  Вперед



Книжный магазин