break, continue и else
Вернёмся на беговую дорожку. До сих пор бегун останавливался только у арки, когда та его не пропускала. Но бывает, что цель достигнута посреди дистанции. Тогда бегун сходит с дорожки сразу, не дожидаясь конца.
Цикл, который что-то ищет, ведёт себя так же: он должен остановиться, как только нашёл. Иначе он проверяет числа, которые уже не нужны. Инструкция break завершает цикл сразу. Эта программа ищет первое число больше 50, которое делится на 7:
for n in range(51, 101):
if n % 7 == 0:
print(n) # 56
breakДва способа изменить ход цикла
Python даёт две инструкции, которые меняют обычный порядок итераций. Обе работают и в for, и в while.
break
break — бегун сходит с дистанции. После break строки ниже него в теле не выполняются, и следующих итераций не будет. Программа продолжается со строки после цикла.
Разберём пример выше по итерациям:
- Для
nот51до55условиеn % 7 == 0ложно, и цикл идёт дальше. - При
n, равной56, условие истинно: программа печатает56. breakзавершает цикл, и числа от57до100уже не проверяются.
break стоит внутри if, но завершает весь цикл, а не только if. Без break программа напечатала бы все такие числа до 100: 56, 63, 70 и так далее до 98.
continue
continue — бегун срезает остаток текущего круга и сразу идёт к арке на следующий. Цикл не заканчивается: for берёт следующее значение и начинает тело заново.
for n in range(1, 7):
if n % 3 == 0:
continue
print(n, end=" ") # 1 2 4 5Давайте пройдём по итерациям:
nравна1: условие ложно,printпечатает1.nравна2: так же печатается2.nравна3: условие истинно,continueпропускаетprint, и цикл берёт4.4и5печатаются.nравна6: сноваcontinue, и на этом числа ряда кончаются.
Числа печатаются в одну строку, потому что end=" " ставит пробел вместо перевода строки. Если заменить continue на break, программа напечатает только 1 2: цикл закончится при n, равной 3.
break и continue в while
В цикле while True: инструкция break — обычный способ выйти, когда цель достигнута. С continue в while нужна осторожность. Счётчик нужно изменить до continue, иначе следующая итерация начнётся с тем же значением, и цикл может стать бесконечным.
else у цикла
У for и while может быть ветка else. Она выполняется, когда цикл закончился сам, и пропускается, если цикл прервал break. На дорожке это медаль за финиш: её получает бегун, который добежал до конца, а сошедший с дистанции остаётся без неё.
Слово else пишут на одном уровне с for, с тем же отступом. Так поиск сообщает, что ничего не нашёл:
for n in range(8, 14):
if n % 7 == 0:
print("found", n)
break
else:
print("not found") # not foundРазберём, что здесь происходит:
range(8, 14)даёт числа от8до13.- Ни одно из них не делится на
7, поэтому телоifне выполняется ни разу. - Числа ряда кончились, цикл закончился сам, и ветка
elseпечатаетnot found.
С range(8, 15) в ряд попадает 14. Программа печатает found 14, break прерывает цикл, и else пропускается.
Название сбивает с толку: «иначе» звучит так, будто ветка выполняется, если цикл не выполнился. На самом деле else у цикла значит «если не было break». Об этом часто спрашивают на собеседованиях.
Частая ошибка
Ветку else написали с отступом if, а не for:
for n in range(8, 15):
if n % 7 == 0:
print("found", n)
break
else: # ✗
print("not found")Ошибки нет, но такая else относится к if и выполняется на каждой итерации, где условие ложно. Программа шесть раз печатает not found — для чисел от 8 до 13 — и только потом found 14.
Главное
breakзавершает весь цикл сразу, даже если стоит внутриif.continueпропускает только остаток текущей итерации, и цикл берёт следующее значение.- Ветка
elseу цикла выполняется, когда цикл закончился сам, безbreak. elseцикла пишут с отступомforилиwhile, а неif.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.