Условия, циклы и итерации

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

Управление потоком выполнения в Python строится из условных конструкций if/elif/else, циклов for/while и протокола итерации. Эти элементы являются фундаментальными для написания эффективного кода. В Python 3.10 появился новый оператор match/case, позволяющий использовать структурное сопоставление с учётом типов данных. Это упрощает и улучшает читаемость кода, особенно при работе с сложными структурами данных.

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

Условия, циклы и итерации в Python выражаются через конструкции if/elif/else, for, while, а также ключевые слова break, continue, pass. В 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.

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

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

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

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