Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 6 из 20 Начальный 15 мин 100 XP

Оператор break в Python: выход из цикла

break выходит из цикла немедленно: нашли нужное — перебирать остальное незачем. Разбираем break в for и while, поиск первого совпадения и мёртвый код после выхода.

Редакция Питоники

Цикл по умолчанию проходит все элементы до конца. Но часто дальнейший перебор бессмыслен: искомое найдено, ошибка обнаружена, лимит достигнут. Продолжать крутить цикл «до конца» — тратить шаги впустую. Оператор break останавливает цикл досрочно: Python мгновенно покидает тело и продолжает программу с первой строки после цикла.

break: выйти немедленно

Следим за температурой: как только превысила норму — прекращаем наблюдение. Проверка стоит в if внутри цикла, выход — в break:

выход по условию
temps = [21, 19, 25, 24, 18]
for t in temps:
    if t > 24:
        print(f'Нагрелось до {t} — останавливаемся')
        break
    print(f'{t} градусов — норм')
print('Цикл закончен')
Вывод
21 градусов — норм
19 градусов — норм
Нагрелось до 25 — останавливаемся
Цикл закончен

Разбираем ход программы. Первые две температуры прошли if, не сработали, и тело напечатало «норм». Третья, 25, превысила границу: сработала ветка if, печать объявила находку, и break вытолкнул выполнение из цикла. Четвёртая и пятая температуры вообще не перебирались — их след в выводе отсутствует. Строка без отступа, «Цикл закончен», выполнилась один раз после выхода. break немедленно выходит из цикла: как только цель найдена, перебирать остальное незачем.

Поиск первого совпадения

Главный сценарий break — поиск первого подходящего элемента. В очереди ищем человека на букву «О»: нашли — останавливаемся, дальше список можно не смотреть:

первое совпадение
queue = ['Пётр', 'Анна', 'Ольга', 'Борис']
for name in queue:
    if name.startswith('О'):
        print(f'Первый на букву О: {name}')
        break
Вывод
Первый на букву О: Ольга

Без break цикл дошёл бы до конца списка и — если бы печатал каждого — нашёл бы и другие совпадения. С break ответ всегда один: первое совпадение, дальше стоп. Для длинных списков это ещё и экономия: сто тысяч позиций, нужная во второй половине — break не тронет первую половину дважды.

первое нарушение бюджета
cart = [89, 42, 590, 130]
budget = 500
for price in cart:
    if price > budget:
        print(f'Не по бюджету: {price}')
        break
    print(f'берём: {price}')
Вывод
берём: 89
берём: 42
Не по бюджету: 590

Поиск с break работает и «от противного»: не первый подходящий, а первый нарушающий правило. Два товара прошли по бюджету, третий остановил перебор — цена 130 уже не рассматривалась, потому что вопрос «сколько ещё помещается» стоять не мог: список исследуют до первого нарушения и останавливаются.

А если совпадения нет ни для одного элемента? break просто не сработает: цикл пройдёт до конца, и программа продолжится со строки после него:

совпадения нет
target = 'Ольга'
for name in ['Пётр', 'Анна']:
    if name == target:
        print(f'{target} нашлась')
        break
print('Перебор закончен — и Ольги там не было')
Вывод
Перебор закончен — и Ольги там не было

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

break ломает накопление

Есть один сценарий, где break выглядит безобидно, а на деле портит результат. Цикл, который что-то накапливает, и цикл, который ищет первое нарушение, — это разные задачи, и путают их легко: правило звучит одинаково («нашли — хватит»), а последствия противоположные.

break посреди подсчёта суммы
prices = [89, 42, 590]
total = 0
for p in prices:
    if p > 500:
        print('слишком дорого, останавливаемся')
        break
    total = total + p
print('итого:', total)
Вывод
слишком дорого, останавливаемся
итого: 131

Итог 131 — это 89 плюс 42. Третий товар стоил 590 и в сумму не попал, потому что break увел цикл раньше, чем строка накопления выполнилась. Если задача звучит как «посчитать сумму всех товаров», break здесь лишний: товар дороже 500 нужно пропустить, а не прервать перебор. Для этого есть continue.

break в while

Оператор один и тот же для обоих видов цикла. В while у него особая роль: часто именно break, а не условие заголовка, становится настоящей гарантией выхода:

выход по событию из while
battery = 100
while battery > 0:
    battery = battery - 30
    print(f'заряд: {battery}')
    if battery <= 50:
        print('Низкий заряд — выключаемся')
        break
Вывод
заряд: 70
заряд: 40
Низкий заряд — выключаемся

Условие заголовка battery > 0 здесь не сработало бы никогда: заряд на выходе равен 40, и 40 больше нуля. Единственной дверью наружу стал break — событие «низкий заряд» прерывает цикл, который формально мог бы идти вечно. Из урока про while мы знаем цену бесконечного условия; break превращает такое условие в осмысленный «цикл ожидания».

обратный отсчёт с досрочной отменой
for sec in range(10, 0, -1):
    print(f'{sec}...')
    if sec == 7:
        print('Отмена запуска!')
        break
Вывод
10...
9...
8...
7...
Отмена запуска!

Отсчёт из урока про range оборван на середине: после семёрки цикл не продолжился — девять шагов сократились до четырёх.

break по словарю

Словарь перебирается циклом так же, как список, и break в нём работает точно так же — только искать приходится по ключу. Сценарий из жизни: идём по товарам и останавливаемся, как только цена превысила бюджет.

первый товар не по карману
prices = {'молоко': 89, 'сыр': 590, 'хлеб': 42}
budget = 200
for name, price in prices.items():
    if price > budget:
        print(f'пропускаем {name} - дорого')
        break
    print(f'покупаем {name}')
Вывод
покупаем молоко
пропускаем сыр - дорого

Молоко купили, на сыре остановились. Хлеб не рассматривался вообще — break вышел из цикла. Если бы замысел был «купить всё, что дешевле бюджета», то и здесь нужен continue: пропустить дорогой товар и продолжить. Разница между этими двумя формулировками стоит целого теста на понимание циклов.

Что выполняется, а что нет

break выходит не «из if», а из всего цикла сразу. При этом остаток тела текущего шага пропускается: строки после break в том же теле на этом шаге не выполняются — ни сейчас, ни когда-либо:

мёртвый код после break
# печать после break не выполнится никогда
for name in ['Анна', 'Артём']:
    if name.startswith('А'):
        break
        print(f'Нашли: {name}')
Не запускаем как учебный образец: вывод пуст. print стоит после break в той же ветке — это мёртвый код: цикл выйдет до него на первой же итерации. Всё, что должно случиться при находке, пишите до break.

Сравните ход цикла с break и без него на одном списке:

Без breakС break
Перебираются все элементы спискаПеребор обрывается на первом совпадении
Цикл всегда идёт до концаВыход — сразу после находки
Совпадений в ответе может быть несколькоОтвет — только первое совпадение
Шаги тратятся на ненужноеШаги экономятся: остальное не смотрится
break вне цикла не существует
print('готовимся')
break
Не запускается: SyntaxError — break вне цикла. Оператор живёт только внутри for или while: без цикла выходить некуда.

Как выйти из вложенного цикла целиком

Вот тут свойство break приводит к сюрпризу. Задача: найти число в таблице и остановиться, не досматривая остальные строки. Внутренний break выйдет только из внутреннего цикла — внешний продолжит свой обход, и таблица будет просмотрена целиком. Для короткой таблицы это незаметно, для таблицы на тысячи строк — обидная потеря времени.

Решение без магии: завести флаг, который говорит внешнему циклу, что работа уже закончена. Флаг проверяется после каждого полного прохода внутреннего цикла.

поиск в таблице с остановкой
matrix = [
    [1, 2],
    [3, 0],
]
target = 3
result = None
for i, row in enumerate(matrix):
    for j, value in enumerate(row):
        if value == target:
            result = (i, j)
            break
    if result is not None:
        break
print(result)
Вывод
(1, 0)

Напечаталось (1, 0) — число 3 нашлось во второй строке, в первом столбце. Разбор по шагам: внутренний цикл находит значение и выходит через свой break, но внешний на этом шаге ещё не завершился; следующая же проверка if result is not None видит найденное и выходит уже из внешнего цикла. Оба break нужны, и оба стоят на своём уровне.

Читается такой код тяжелее обычного, и это честная цена: у Python нет оператора «выйти из всех вложенных циклов». Альтернатива — вынести поиск в отдельную функцию и сделать return из неё: функция выйдет целиком, а вызывающий код останется чистым. Такой приём разбирается в разделе про функции.

  • поиск первого совпадения: первый дорогой товар, первый файл с нужным словом, первый свободный слот;
  • выход по событию в while: лимит достигнут, заряд сел, счётчик совпал;
  • оборванное действие: отсчёт, который отменили на середине;
  • антипод break — оператор continue: он не выходит из цикла, а пропускает только текущий шаг — следующий урок сравнит их на одних данных.

break урезает перебор с конца: нашли — выходим. Родственный оператор решает обратную задачу — оставить элемент в переборе, но пропустить его обработку. Это continue, и он разбирается дальше.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

for n in [1, 2, 3, 4]:
    if n == 3:
        break
    print(n)
n = 5
while n > 0:
    if n == 2:
        break
    print(n)
    n = n - 1
for ch in 'кот':
    print(ch)
    if ch == 'о':
        break
Проверь себя
0 / 9

1. Что делает break?

2. Выполнятся ли строки тела, написанные после break?

3. Во вложенных циклах break выходит из...

4. Что произойдёт, если условие для break не сработало ни на одном элементе?

5. В каких циклах работает break?

6. Что напечатает цикл с break при поиске первого товара дороже бюджета?

7. Почему цикл с накоплением и break может дать неверную сумму?

8. Как выйти сразу из двух вложенных циклов?

9. Чем отличается цикл «купить всё дешевле бюджета» от цикла «прерваться на первом дорогом»?

Карточки терминов
Запомнено: 0 / 8
Практика

В списке cart = [89, 42, 590, 130] найди первый товар дороже 500: напечатай «Дорогой товар: {цена}» и выйди из цикла. После цикла напечатай «Поиск закончен».

practice.py
Вопросы и ответы по уроку

Как выйти из цикла досрочно в Python?

Оператором break: как только условие выполнено, break немедленно завершает цикл, и программа продолжается со строки после него. Работает и в for, и в while.

Урок 5: цикл while

Что делает break внутри if?

Проверка if лишь решает, сработает ли выход: попав в ветку, break покидает весь цикл, а не только ветку. Остаток тела текущего шага пропускается, поэтому break пишут последней строкой ветки.

Чем break отличается от continue?

break выходит из цикла совсем: перебор прекращён. continue пропускает только текущий шаг: остаток тела не выполняется, но цикл продолжается со следующим элементом. На списке [1, 2, 3, 4] с break при n == 3 напечатается 1, 2; с continue — 1, 2, 4.

Урок 7: continue — пропуск итерации

Break выходит из обоих вложенных циклов?

Нет, только из своего: break останавливает ближайший цикл, внутри которого написан. Внешний цикл продолжит шаги — для выхода из обоих понадобятся отдельные break в каждом уровне или перестройка условия.

Как найти элемент в двумерной таблице и сразу остановиться?

Внутренний цикл находит элемент и выходит через break, а внешний проверяет флаг и выходит своим break: if result is not None: break. Либо вынесите поиск в функцию и используйте return — выход из функции завершает все её циклы сразу.

Урок 8: вложенные циклы

Почему break опасен в цикле, который копит сумму?

Остаток тела при break не выполняется, поэтому строка накопления может не отработать — и часть данных молча выпадет из результата. Если элемент нужно отбросить и продолжить, используйте continue вместо break.

Понравился урок? Сошлитесь на него

«break немедленно выходит из цикла: как только цель найдена, перебирать остальное незачем.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.