break, continue и pass в Python: управление циклами
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Вы ищете номер друга в телефонной книге. Когда он нашёлся, станете ли вы листать все оставшиеся страницы? Конечно нет, вы остановитесь. Или представьте, что разбираете почту: спам вы пропускаете и читаете только настоящие письма. Это бытовые примеры управления ходом цикла.
В Python есть три инструкции, которые управляют тем, что происходит внутри цикла: break (полностью остановить цикл), continue (перейти к следующей итерации) и pass (ничего не делать, только занять место). В этом уроке мы разберём все три, а также необычную конструкцию for-else, которой в других языках почти нет.
К концу урока вы будете точно знать, когда нужна каждая из этих инструкций и как они меняют поведение циклов.
Как работает break в Python?
Инструкция break немедленно завершает цикл, внутри которого находится. Python переходит к первой строке кода после цикла. Больше никаких итераций и проверок условия: цикл окончен.
Считайте break запасным выходом. У цикла есть обычный выход (условие становится False или заканчиваются элементы), но break позволяет уйти раньше, когда вы нашли то, что нужно.
Checking Alice... Checking Bob... Checking Charlie... Found Charlie! Search complete.
Без break цикл проверил бы ещё Diana и Eve, а это лишняя работа: Charlie уже найден. Инструкция break экономит время, останавливая цикл, как только задача выполнена.
First even number: 8
Цикл останавливается на 8, потому что это первое чётное число. Число 2 тоже чётное, но до него цикл так и не доходит. Шаблон «найти первое совпадение и остановиться» относится к самым частым применениям break.
Как работает continue в Python?
Инструкция continue пропускает остаток текущей итерации и возвращается в начало цикла. Сам цикл продолжает работать: он переходит к следующему элементу (а цикл while снова проверяет условие).
Если break служит запасным выходом, то continue больше похожа на кнопку «пропустить». Вы по-прежнему проходите цикл, но именно этот элемент обрабатывать не хотите.
1 3 5 7 9
Когда num чётное (2, 4, 6, 8, 10), continue пропускает print() и переходит к следующей итерации. Когда num нечётное, continue не выполняется, и print() срабатывает как обычно.
for num in range(1, 11):
if num % 2 != 0:
print(num)for num in range(1, 11):
if num % 2 == 0:
continue
print(num)Обе версии выводят одно и то же. Для такого простого примера вариант с if вполне годится. Но continue по-настоящему раскрывается, когда после условия пропуска идёт много строк кода: код остаётся плоским, без глубоких отступов.
Recorded: 85 Skipping invalid score: -1 Recorded: 92 Skipping invalid score: 150 Recorded: 73 Recorded: 88 Skipping invalid score: -5 Recorded: 100 Average of 5 valid scores: 87.6
Здесь continue работает как фильтр. Некорректные оценки (отрицательные или больше 100) пропускаются, и строки с вычислениями для них не выполняются. В сумму попадают только допустимые оценки. Это чище, чем оборачивать весь код обработки в большой блок if.
Что делает pass в Python?
Инструкция pass не делает ровным счётом ничего. Это заглушка, которая говорит: «Я знаю, что здесь нужен код, но пока его не написал». Python требует хотя бы одну инструкцию в любом блоке (после if, for, while, определения функции и т. д.), и pass выполняет это требование.
Считайте pass табличкой «Ведутся работы» на стройке. Здание ещё не готово, но каркас уже стоит. Табличка сообщает и Python, и другим программистам, что место пустует намеренно.
Loop finished (nothing happened yet)
Без pass Python выдал бы IndentationError, ведь после каждого двоеточия он ожидает блок с отступом. Инструкция pass выполняет это требование и при этом ничего не делает.
HelloWorld
В этом примере pass ясно показывает, что всё, кроме букв, мы игнорируем намеренно. Можно было бы вовсе убрать else: pass, и программа работала бы так же, но с ним ваш замысел понятен другим читателям.
Что такое конструкция for-else в Python?
В Python есть возможность, которой нет в большинстве других языков: к циклу for или while можно присоединить блок else. Блок else выполняется, только если цикл завершился обычным образом, то есть его НЕ прервал break.
Поначалу это сбивает с толку, ведь обычно else означает «если условие оказалось False». Но в циклах читайте его как «а если break так и не сработал». Если цикл прошёл все итерации и ни разу не дошёл до break, выполняется else.
Found 9!
Цикл нашёл 9, поэтому сработал break, а блок else был пропущен. Блок else выполняется, только если цикл дошёл до конца без прерываний.
6 was not found.
На этот раз цикл проверил все числа и так и не нашёл 6. Поскольку break ни разу не сработал, выполнился блок else. Такой приём заменяет распространённый шаблон с логическим флагом вроде found = False.
found = False
for num in numbers:
if num == target:
print(f"Found {target}!")
found = True
break
if not found:
print(f"{target} not found.")for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} not found.")Версия с for-else обходится без флага found. Так задачи вида «найти и сообщить результат» решаются больше в духе Python.
Практическое применение break, continue и pass
Посмотрим, как эти три инструкции работают вместе в более жизненном примере. Этот код обрабатывает пачку заказов и по-разному реагирует на разные ситуации.
Processing order #1: Laptop Processing order #4: Monitor System halt received. Stopping.
Заказ №1 (Laptop) ожидает обработки, поэтому его обрабатывают. Заказ №2 (Mouse) уже отправлен, и continue его пропускает. Заказ №3 (Keyboard) отменён и тоже пропускается. Заказ №4 (Monitor) ожидает, поэтому его обрабатывают. В заказе №5 стоит команда STOP, и break полностью завершает цикл. До заказа №6 дело так и не доходит.
Типичная схема такая: break для условий «остановить всё», continue для условий «пропустить этот элемент», а остальное тело цикла для обычной обработки.
Практические упражнения
Пора потренироваться управлять ходом цикла! Эти упражнения проверят, понимаете ли вы, когда использовать break, continue и конструкцию for-else.
Внимательно читайте, что требуется в каждом упражнении. Частая ошибка: использовать break там, где нужен continue (или наоборот).
С помощью цикла for и break найдите и выведите первое отрицательное число в списке. Выведите «Found:», пробел и само число.
Ожидаемый вывод:
Found: -3С помощью цикла for и continue выведите все символы строки "beautiful", пропуская гласные (a, e, i, o, u). Выводите каждую согласную на одной строке с помощью end="".
Ожидаемый вывод:
btflНе забудьте в конце вызвать пустой print(), чтобы аккуратно перейти на новую строку.
Не запуская код, предскажите, что именно он выведет. Пройдите по каждой итерации и подумайте, когда срабатывают continue и break.
Затем запустите код и проверьте свой ответ.
Этот код должен складывать числа из списка, пока не встретит отрицательное, и на нём остановиться. Но кто-то написал continue вместо break. Исправьте ошибку, чтобы код выводил:
Sum before negative: 15Не меняйте ничего, кроме одного неправильного ключевого слова.
С помощью конструкции for-else проверьте, есть ли в пароле хотя бы одна цифра. Переберите все символы пароля. Если нашлась цифра, выведите "Password accepted" и прервите цикл через break. Если цикл закончился, а цифра так и не нашлась, выведите "Password must contain a number".
Ожидаемый вывод для заданного пароля:
Password acceptedИтоги: break, continue, pass
Краткая шпаргалка по всем трём инструкциям управления циклом:
| Инструкция | Что делает | Когда использовать |
|---|---|---|
break | Немедленно завершает цикл | Нашли то, что искали, или сработало условие остановки |
continue | Переходит к следующей итерации | Текущий элемент не нужно обрабатывать |
pass | Ничего не делает (заглушка) | Пустой блок, который вы заполните позже |
for-else | else выполняется, если не было break | Поиск: «нашли» или «не нашли» |
Главные правила:
break останавливает ВЕСЬ цикл, а не одну итерациюcontinue пропускает только ТЕКУЩУЮ итерацию, а цикл продолжаетсяpass служит только заглушкой и ничего не делаетbreak выходит только из самого внутреннегоelse в for-else выполняется, когда цикл завершился БЕЗ breakcontinue (пропустить один элемент) с break (остановить всё)Что дальше?
Теперь вы умеете точно управлять ходом цикла. Следующая тема: [вложенные циклы в Python](/python/python-nested-loops). Вы научитесь помещать циклы внутрь других циклов, чтобы работать с сетками, комбинациями и многомерными данными. Вложенные циклы вместе с break и continue открывают дорогу к мощным приёмам.