Глава 9 · Выполняй мою команду!

Short-circuit: Python иногда ленится

and и or не всегда вычисляют оба операнда — и это свойство можно использовать, чтобы защититься от ошибок.

Python иногда не проверяет всё условие

У and и or есть важное свойство — short-circuit («короткое замыкание»): Python вычисляет второй операнд, только если это действительно нужно для ответа.

and: если A уже False

СТАРТA?НЕТFalseДАB?НЕТFalseДАTrueКОНЕЦ
and: НЕТ на любом шаге сразу даёт False — второе условие проверяется, только если первое истинно

Если A ложно, весь A and B уже обязан быть ложным — независимо от B. Python это понимает и не тратит время на вычисление B.

or: если A уже True

СТАРТA?ДАTrueНЕТB?ДАTrueНЕТFalseКОНЕЦ
or: ДА на любом шаге сразу даёт True — второе условие проверяется, только если первое ложно

Аналогично: если A истинно, весь A or B уже обязан быть истинным.

Реальная польза: защита от ошибки

Это не просто оптимизация скорости — иногда именно она спасает программу от падения:

short_circuit_zashchita.py
name = ""

if name and name[0] == "A":
    print("Имя начинается на A")
else:
    print("Условие не выполнено")

Если name — пустая строка, она сама по себе falsy (глава 8), поэтому name and ... уже ложно, и Python даже не пытается вычислить name[0]. Если бы порядок был обратным...

bez_zashchity.py
name = ""
print(name[0] == "A" and name)
# IndexError: string index out of range!
Порядок операндов имеет значение
name and name[0] == "A" — безопасно: сначала проверяется, что name вообще непустая. name[0] == "A" and name — опасно: Python попытается вычислить name[0] ещё до всякой проверки на пустоту, и получит IndexError для пустой строки (глава 8, раздел про индексы).
★★ Самостоятельная задача
Безопасная проверка последнего символа

Напишите условие, которое безопасно проверяет, заканчивается ли непустая строка text на символ '!' — так, чтобы для пустой строки не возникало IndexError.

Практика: short-circuit и защита от ошибок
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →