match-case, тернарный оператор, in и is

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

Это компактные средства ветвления в Python. match (3.10+) — структурный pattern matching, который позволяет разбирать кортежи, словари и объекты dataclass-ов по форме, а не только сравнивать значения. Тернарный оператор x if cond else y используется для простых решений в одну строку; при вложении условий на более чем один уровень лучше вынести логику в обычный if-блок. Оператор in вызывает метод __contains__, который может работать за константное время для set и dict, но за линейное для list. Оператор is проверяет идентичность, а не равенство, поэтому x is None — корректно, а x is 1000 — нет. Стоит быть осторожным с голым именем в case, так как оно захватывает значение, а не сравнивает его с существующим значением — лучше использовать case Color.RED: или guard.

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

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

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

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

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

Ловушки при работе с match-case, тернарным оператором, in и is включают в себя следующие:

Циклы следует держать короткими и чистыми — выносите тело в функцию.

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

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