if, elif, else, сравнения и логические операторы

Тема дорожной карты · Python Programming

Ветвление в Python строится на ключевых словах if, elif, else с проверкой на truthiness: пустые контейнеры, 0, None и False считаются ложными. Логические операторы and и or короткозамкнуты и возвращают сам операнд, а не обязательно булево значение — это удобно, но может быть источником тонких багов. Начиная с версии 3.10, в Python появились конструкции match и case для структурного паттерн-матчинга, что позволяет избежать длинных цепочек elif. При этом важно помнить, что операторы сравнения == и is не всегда эквивалентны: is уместен только для None и singleton-ов, а цепочечные сравнения вроде 0 < x < 10 читаются естественно, но вычисляются слева направо.

Как это работает

Конструкции if, elif, else, сравнения и логические операторы в Python выражаются через ключевые слова if/elif/else, for, while, break, continue, pass, а также с 3.10 — через структурное паттерн-матчинг match/case. В Python нет специального ключевого слова switch для старых версий, поэтому идиоматичны цепочки if/elif. Ключевое слово for итерирует все объекты, поддерживающие интерфейс __iter__ (списки, генераторы, файлы); while выполняется до тех пор, пока условие не станет ложным. Конструкции for ... else и while ... else выполняют блок else только если цикл завершился без использования break — это мощная, но редко используемая фича.

Когда применять

Используйте for вместо while, когда вы итерируете по известной последовательности — это короче и в нём сложнее ошибиться с бесконечным циклом. Конструкции match/case предназначены для диспетчеризации по форме данных (tagged unions, AST-узлы); цепочка isinstance — это запах, который должен стать match. Используйте enumerate(xs) и zip(xs, ys) вместо арифметики с индексами — это читается лучше и исключает ошибки off-by-one.

Типичные ошибки

Типичные ловушки при использовании if, elif, else, сравнений и логических операторов: проверка if x, когда имели в виду if x is not None (тогда 0, "", [] ведут себя одинаково); мутация списка при итерации (for x in xs: xs.remove(x) пропускает элементы); = вместо == в условиях (синтаксически ловится, но := walrus усложняет); чрезмерное использование try/except как потока управления (медленнее if, маскирует логику). Циклы держите короткими и чистыми — выносите тело в функцию.

Связанные понятия

Полезные ресурсы