Справочник по Python · модуль 3 · списки и циклы
Глава 3.17
Значения and,
or и None
and и or возвращают один из своих операндов, а не обязательно логический тип. Это позволяет задавать запасное значение, но требует отличать Falsy-данные от специального отсутствия — None.
- Категория
- Логические выражения
- Уровень
- Средний
- Связанные темы
- Truthy/Falsy, and, or, None
- Зачем это знать
- Понимать результат логических цепочек и проверять отсутствие значения
§1Какое значение возвращает and
and идёт слева направо и возвращает первое Falsy-значение. Если все операнды истинны, результатом становится последний.
print(5 and 10) print(0 and 10) print("Python" and [1, 2])
10 0 [1, 2]
§2Короткое вычисление and
После первого ложного операнда итог уже известен, поэтому выражения справа не вычисляются.
denominator = 0 safe = denominator != 0 and 10 / denominator print(safe)
False
§3Какое значение возвращает or
or возвращает первое Truthy-значение. Если все операнды ложны, возвращается последний.
print(0 or 10) print("" or "Python") print(None or 0 or [])
10 Python []
§4Запасное значение через or
Шаблон value or default выбирает запасной вариант, если первое значение Falsy.
name = "" username = name or "Anonymous" print(username)
Anonymous
Если 0, пустая строка или пустой список являются допустимыми значениями, value or default ошибочно заменит их. Тогда проверяйте value is None.
§5Короткое вычисление or
После первого истинного операнда остальная цепочка не нужна.
def announce(): print("вызов") return "результат" value = "готово" or announce() print(value)
готово
§6Что означает None
None обозначает отсутствие значения. Его часто возвращает функция, когда результата нет, или использует параметр, для которого значение пока не задано.
def find_even(numbers): for number in numbers: if number % 2 == 0: return number return None print(find_even([1, 3, 5]))
None
§7Проверка is None
Для None принята проверка идентичности: value is None и value is not None. Она точно выражает намерение и не зависит от правил равенства других типов.
result = None if result is None: print("Результат не найден")
Результат не найден
§8Falsy — не то же самое, что None
None является Falsy, но не каждое Falsy-значение означает отсутствие. Число 0 может быть полноценным результатом.
result = 0 print(bool(result)) print(result is None) print(result is not None)
False False True
§9is и == решают разные задачи
| Оператор | Вопрос | Обычное применение |
|---|---|---|
== | равны ли значения? | score == 0, name == "Анна" |
is | это именно один и тот же объект? | result is None |
Не заменяйте обычное сравнение чисел или строк оператором is. Для равенства данных используется ==.
§10Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
bool(5 and 10) считают самим результатом 5 and 10 | and вернёт 10, а bool(...) уже преобразует его в True | различать операнд-результат и его истинность |
count = value or 100, когда ноль допустим | 0 будет заменён на 100 | 100 if value is None else value |
value == None | работает для простых значений, но не выражает проверку идентичности | value is None |
if value: для проверки только на None | нули и пустые коллекции тоже попадут в ложную ветку | if value is not None: |
number is 1000 | идентичность чисел не является проверкой равенства | number == 1000 |
§11Проверьте себя
Что вернёт "" or "гость"?
Строку "гость", потому что первый операнд пуст и считается Falsy.
Почему if value: не заменяет if value is not None:?
Первая проверка отклоняет все Falsy-значения, включая допустимые 0, "" и [].
Когда используется ==, а когда is?
== сравнивает значения; is в этой теме нужен для точной проверки None.
§12Шпаргалка
первое ложное или последнее истинноепервое истинное или последнее ложноеvalue is Nonevalue is not NoneИтог главы
and возвращает первый ложный операнд либо последний истинный, а or — первый истинный либо последний ложный. Оба оператора останавливаются, как только результат определён. Проверка истинности отвечает на вопрос о содержимом, а is None — о специальном отсутствии значения.