DamiRocK

Python: почему and и or возвращают не только True и False

Исследуем пустую строку, ноль, True и bool(). Отличаем короткое замыкание от обязательного вычисления всех частей и сохраняем тип возвращённого операнда.

Не только логические операнды

В Python and и or используют истинность значений, но возвращают один из самих операндов. Для a or b результатом становится a, если он истинен, иначе b. Для a and b — a, если он ложен, иначе b.

Упражнение источника

Выполните три выражения и сравните значения и типы:

print("" or 0)             # 0
print(0 and True)          # 0
print(bool(0 and True))    # False

В первой строке пустая строка ложна, поэтому возвращается второй операнд — целое 0. Во второй строке первый операнд уже ложный, поэтому возвращается тот же 0. В третьей bool явно переводит результат в логический тип.

Короткое замыкание

Если результат определился на первой части, вторая не вычисляется. Например, False and (1 / 0) возвращает False без деления на ноль. Но True and (1 / 0) уже выполняет деление и вызывает ошибку.

Это свойство можно использовать для защиты доступа к данным, однако условие защиты должно действительно покрывать все опасные случаи.

Истинность значений

Нули, None и пустые встроенные коллекции обычно ложны, непустые строки истинны — в том числе "0" и "False". Список ложных значений не ограничен несколькими литералами: пользовательские классы тоже могут определять своё поведение через специальные методы.

Значение по умолчанию

Конструкция name or "Anonymous" удобна, если нужно заменить любое ложное name. Но она также заменит пустую строку, а не только None. Если пустая строка является допустимым отдельным значением, проверять следует нужное условие явно, например name is None.

Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Выражения сохранены; истинность и короткое замыкание уточнены.

Reading preferences

Appearance
Contrast
More options

Saved only in this browser. Your device’s reduced-motion setting is always respected. Browser zoom works throughout the site.