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 включают в себя следующие:
- Использование
if x, когда имели в видуif x is not None(тогда0,"",[]ведут себя одинаково); - Мутация списка при итерации (
for x in xs: xs.remove(x)пропускает элементы); - Ошибочное использование
=вместо==в условиях (синтаксически ловится, но:=walrus усложняет); - Чрезмерное использование
try/exceptкак потока управления (медленнееif, маскирует логику).
Циклы следует держать короткими и чистыми — выносите тело в функцию.