Перейти к содержимому
Теория · Циклы · урок 4 из 7

break, continue и else

Вернёмся на беговую дорожку. До сих пор бегун останавливался только у арки, когда та его не пропускала. Но бывает, что цель достигнута посреди дистанции. Тогда бегун сходит с дорожки сразу, не дожидаясь конца.

Цикл, который что-то ищет, ведёт себя так же: он должен остановиться, как только нашёл. Иначе он проверяет числа, которые уже не нужны. Инструкция break завершает цикл сразу. Эта программа ищет первое число больше 50, которое делится на 7:

Python
for n in range(51, 101):
    if n % 7 == 0:
        print(n)  # 56
        break

Два способа изменить ход цикла

Python даёт две инструкции, которые меняют обычный порядок итераций. Обе работают и в for, и в while.

break

break — бегун сходит с дистанции. После break строки ниже него в теле не выполняются, и следующих итераций не будет. Программа продолжается со строки после цикла.

Разберём пример выше по итерациям:

  1. Для n от 51 до 55 условие n % 7 == 0 ложно, и цикл идёт дальше.
  2. При n, равной 56, условие истинно: программа печатает 56.
  3. break завершает цикл, и числа от 57 до 100 уже не проверяются.

break стоит внутри if, но завершает весь цикл, а не только if. Без break программа напечатала бы все такие числа до 100: 56, 63, 70 и так далее до 98.

continue

continue — бегун срезает остаток текущего круга и сразу идёт к арке на следующий. Цикл не заканчивается: for берёт следующее значение и начинает тело заново.

Python
for n in range(1, 7):
    if n % 3 == 0:
        continue
    print(n, end=" ")  # 1 2 4 5

Давайте пройдём по итерациям:

  1. n равна 1: условие ложно, print печатает 1.
  2. n равна 2: так же печатается 2.
  3. n равна 3: условие истинно, continue пропускает print, и цикл берёт 4.
  4. 4 и 5 печатаются.
  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, с тем же отступом. Так поиск сообщает, что ничего не нашёл:

Python
for n in range(8, 14):
    if n % 7 == 0:
        print("found", n)
        break
else:
    print("not found")  # not found

Разберём, что здесь происходит:

  1. range(8, 14) даёт числа от 8 до 13.
  2. Ни одно из них не делится на 7, поэтому тело if не выполняется ни разу.
  3. Числа ряда кончились, цикл закончился сам, и ветка else печатает not found.

С range(8, 15) в ряд попадает 14. Программа печатает found 14, break прерывает цикл, и else пропускается.

Название сбивает с толку: «иначе» звучит так, будто ветка выполняется, если цикл не выполнился. На самом деле else у цикла значит «если не было break». Об этом часто спрашивают на собеседованиях.

Частая ошибка

Ветку else написали с отступом if, а не for:

Python
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 и подпишись на канал — откроются все уроки.

Войти другим способом