Short-circuit: Python иногда ленится
and и or не всегда вычисляют оба операнда — и это свойство можно использовать, чтобы защититься от ошибок.
Python иногда не проверяет всё условие
У and и or есть важное
свойство — short-circuit («короткое замыкание»): Python вычисляет второй
операнд, только если это действительно нужно для ответа.
and: если A уже False
Если A ложно, весь A and B уже
обязан быть ложным — независимо от B. Python это понимает и не
тратит время на вычисление B.
or: если A уже True
Аналогично: если A истинно, весь
A or B уже обязан быть истинным.
Реальная польза: защита от ошибки
Это не просто оптимизация скорости — иногда именно она спасает программу от падения:
name = ""
if name and name[0] == "A":
print("Имя начинается на A")
else:
print("Условие не выполнено")
Если name — пустая строка, она сама по себе falsy (глава 8),
поэтому name and ... уже ложно, и Python даже не
пытается вычислить name[0]. Если бы порядок был
обратным...
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.