break, continue и вложенные условия в цикле
Содержание курса
Почему continue иногда зацикливает while
В цикле for следующий элемент выдаётся самим циклом. В while условие тоже проверяется заново, но переменную-счётчик обычно меняет ваш код. Если поставить continue до увеличения счётчика, выполнение снова вернётся к тому же значению. Так появляется бесконечный цикл, хотя условие остановки на вид написано правильно.
i = 0
while i < 4:
i += 1
if i == 2:
continue
print(i)
Результат — 1, 3, 4 на отдельных строках: число 2 пропущено, но счётчик всё равно вырос. Проверьте порядок на своём примере: строка, которая приближает while к завершению, должна выполняться на каждом проходе, в том числе перед continue. Если нужно остановить цикл при особом значении, используйте break; если нужно лишь пропустить обработку этого значения, оставьте continue. При зависании сначала найдите значения переменных перед условием while и перед строкой continue: одинаковое значение на каждом проходе почти всегда указывает на пропущенное обновление. Закрепить разницу между двумя командами можно в практическом задании на break и continue.
Вложенный if в цикле и типичная путаница break vs continue
Сами по себе break и continue — просто ключевые слова. Чтобы они срабатывали по условию, а не безусловно, их помещают внутрь if в теле цикла. Вот как это выглядит в общем виде:
for элемент in последовательность:
if особый_случай_1:
break # выходим из цикла полностью
if особый_случай_2:
continue # пропускаем остаток этой итерации
# обычный код — выполняется, если ни одно условие не сработало
Вложенный if здесь играет роль диспетчера: на каждой итерации он проверяет, что за значение пришло, и направляет поток в нужную ветку. Это стандартный паттерн — почти любой реальный цикл с break или continue выглядит именно так.
Теперь о типичной ошибке. Начинающие нередко путают эти две инструкции, потому что обе стоят внутри if и обе «прерывают» нормальный ход итерации. Разница в масштабе действия:
break— выход из цикла навсегда, следующих итераций не будет.continue— только текущая итерация «срезается», цикл продолжается дальше.
Ошибка обычно выглядит так: нужно остановить весь цикл при находке нужного элемента, а вместо break ставят continue. Цикл при этом не останавливается — он просто пропускает тот самый элемент и перебирает оставшиеся:
numbers = [1, 4, 7, 3, 9]
# Неправильно: хотели остановиться при нахождении 7, но поставили continue
for n in numbers:
if n == 7:
continue # 7 просто пропускается, цикл идёт дальше
print(n)
# Вывод: 1 4 3 9 — семёрка пропущена, но цикл не остановился
# Правильно: break действительно останавливает цикл
for n in numbers:
if n == 7:
break # нашли — выходим
print(n)
# Вывод: 1 4 — дойдя до 7, цикл завершился
Разница в выводе наглядна: в первом случае программа обошла весь список, только проигнорировав семёрку. Во втором — остановилась ровно на ней.
Обратная ошибка встречается реже, но тоже бывает: ставят break там, где хотели лишь пропустить одно значение. Тогда цикл обрывается при первом же «неудобном» элементе, а остальные так и не обрабатываются.
Практический способ не ошибиться — спросить себя: «После этой инструкции цикл должен продолжить работу или закончить?» Если продолжить — continue. Если закончить — break.
