Модуль 3 · Списки и циклы

Справочник по Python · модуль 3 · списки и циклы

Глава 3.17

3.17

Значения and,
or и None

and и or возвращают один из своих операндов, а не обязательно логический тип. Это позволяет задавать запасное значение, но требует отличать Falsy-данные от специального отсутствия — None.

Категория
Логические выражения
Уровень
Средний
Связанные темы
Truthy/Falsy, and, or, None
Зачем это знать
Понимать результат логических цепочек и проверять отсутствие значения

§1Какое значение возвращает and

and идёт слева направо и возвращает первое Falsy-значение. Если все операнды истинны, результатом становится последний.

main.pyрезультат — один из операндов
print(5 and 10)
print(0 and 10)
print("Python" and [1, 2])
Вывод10, первый ноль, последний список
10
0
[1, 2]

§2Короткое вычисление and

После первого ложного операнда итог уже известен, поэтому выражения справа не вычисляются.

main.pyделения на ноль не будет
denominator = 0
safe = denominator != 0 and 10 / denominator
print(safe)
Выводостановка на False
False

§3Какое значение возвращает or

or возвращает первое Truthy-значение. Если все операнды ложны, возвращается последний.

main.pyпоиск первого истинного
print(0 or 10)
print("" or "Python")
print(None or 0 or [])
Выводдва истинных и последнее ложное
10
Python
[]

§4Запасное значение через or

Шаблон value or default выбирает запасной вариант, если первое значение Falsy.

main.pyпустое имя заменяется
name = ""
username = name or "Anonymous"
print(username)
Выводсработал запасной вариант
Anonymous
Ноль может быть данными

Если 0, пустая строка или пустой список являются допустимыми значениями, value or default ошибочно заменит их. Тогда проверяйте value is None.

§5Короткое вычисление or

После первого истинного операнда остальная цепочка не нужна.

main.pyвторой вызов не выполняется
def announce():
    print("вызов")
    return "результат"

value = "готово" or announce()
print(value)
Выводannounce() пропущена
готово

§6Что означает None

None обозначает отсутствие значения. Его часто возвращает функция, когда результата нет, или использует параметр, для которого значение пока не задано.

main.pyпоиск может ничего не найти
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. Она точно выражает намерение и не зависит от правил равенства других типов.

main.pyточная проверка отсутствия
result = None
if result is None:
    print("Результат не найден")
Выводзначение отсутствует
Результат не найден

§8Falsy — не то же самое, что None

None является Falsy, но не каждое Falsy-значение означает отсутствие. Число 0 может быть полноценным результатом.

main.pyноль существует
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 10and вернёт 10, а bool(...) уже преобразует его в Trueразличать операнд-результат и его истинность
count = value or 100, когда ноль допустим0 будет заменён на 100100 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Шпаргалка

andпервое ложное или последнее истинное
orпервое истинное или последнее ложное
Нет значенияvalue is None
Значение заданоvalue is not None

Итог главы

and возвращает первый ложный операнд либо последний истинный, а or — первый истинный либо последний ложный. Оба оператора останавливаются, как только результат определён. Проверка истинности отвечает на вопрос о содержимом, а is None — о специальном отсутствии значения.

Глава 3.17 · and, or и None · Справочник по PythonАвтор: Макаров Максим Николаевич