Перейти к содержимому
Editor

break, continue и pass в Python: управление циклами

Начальный20 min5 упр.65 XP

Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе

0/5 упр.

Вы ищете номер друга в телефонной книге. Когда он нашёлся, станете ли вы листать все оставшиеся страницы? Конечно нет, вы остановитесь. Или представьте, что разбираете почту: спам вы пропускаете и читаете только настоящие письма. Это бытовые примеры управления ходом цикла.

В Python есть три инструкции, которые управляют тем, что происходит внутри цикла: break (полностью остановить цикл), continue (перейти к следующей итерации) и pass (ничего не делать, только занять место). В этом уроке мы разберём все три, а также необычную конструкцию for-else, которой в других языках почти нет.

К концу урока вы будете точно знать, когда нужна каждая из этих инструкций и как они меняют поведение циклов.

Как работает break в Python?

Инструкция break немедленно завершает цикл, внутри которого находится. Python переходит к первой строке кода после цикла. Больше никаких итераций и проверок условия: цикл окончен.

Считайте break запасным выходом. У цикла есть обычный выход (условие становится False или заканчиваются элементы), но break позволяет уйти раньше, когда вы нашли то, что нужно.

Досрочный выход из цикла с помощью break
# Search for a name in a list
names = ["Alice", "Bob", "Charlie", "Diana", "Eve"]
target = "Charlie"
for name in names:
print(f"Checking {name}...")
if name == target:
print(f"Found {target}!")
break
print("Search complete.")
# Output:
# Checking Alice...
# Checking Bob...
# Checking Charlie...
# Found Charlie!
# Search complete.
Вывод
Checking Alice...
Checking Bob...
Checking Charlie...
Found Charlie!
Search complete.

Без break цикл проверил бы ещё Diana и Eve, а это лишняя работа: Charlie уже найден. Инструкция break экономит время, останавливая цикл, как только задача выполнена.

Поиск первого совпадения с помощью break
# Find the first even number in a list
numbers = [7, 3, 11, 8, 5, 2, 9]
for num in numbers:
if num % 2 == 0:
print(f"First even number: {num}")
break
# Output:
# First even number: 8
Вывод
First even number: 8

Цикл останавливается на 8, потому что это первое чётное число. Число 2 тоже чётное, но до него цикл так и не доходит. Шаблон «найти первое совпадение и остановиться» относится к самым частым применениям break.


Как работает continue в Python?

Инструкция continue пропускает остаток текущей итерации и возвращается в начало цикла. Сам цикл продолжает работать: он переходит к следующему элементу (а цикл while снова проверяет условие).

Если break служит запасным выходом, то continue больше похожа на кнопку «пропустить». Вы по-прежнему проходите цикл, но именно этот элемент обрабатывать не хотите.

Пропуск чётных чисел с помощью continue
# Print only odd numbers from 1 to 10
for num in range(1, 11):
if num % 2 == 0:
continue # skip even numbers
print(num)
# Output:
# 1
# 3
# 5
# 7
# 9
Вывод
1
3
5
7
9

Когда num чётное (2, 4, 6, 8, 10), continue пропускает print() и переходит к следующей итерации. Когда num нечётное, continue не выполняется, и print() срабатывает как обычно.

Без continue (вложенный if)
for num in range(1, 11):
    if num % 2 != 0:
        print(num)
С continue (без вложенности)
for num in range(1, 11):
    if num % 2 == 0:
        continue
    print(num)

Обе версии выводят одно и то же. Для такого простого примера вариант с if вполне годится. Но continue по-настоящему раскрывается, когда после условия пропуска идёт много строк кода: код остаётся плоским, без глубоких отступов.

Пропуск некорректных данных с помощью continue
# Process only valid scores, skip invalid ones
scores = [85, -1, 92, 150, 73, 88, -5, 100]
valid_count = 0
total = 0
for score in scores:
if score < 0 or score > 100:
print(f" Skipping invalid score: {score}")
continue
valid_count += 1
total += score
print(f" Recorded: {score}")
average = total / valid_count
print(f"\nAverage of {valid_count} valid scores: {average:.1f}")
# Output:
# 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
Вывод
  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, и другим программистам, что место пустует намеренно.

pass в роли заглушки
# Skeleton code - structure first, logic later
for num in range(10):
if num % 2 == 0:
pass # TODO: handle even numbers
else:
pass # TODO: handle odd numbers
print("Loop finished (nothing happened yet)")
# Output:
# Loop finished (nothing happened yet)
Вывод
Loop finished (nothing happened yet)

Без pass Python выдал бы IndentationError, ведь после каждого двоеточия он ожидает блок с отступом. Инструкция pass выполняет это требование и при этом ничего не делает.

pass для явного игнорирования случаев
# Common use: ignore specific cases
for char in "Hello, World! 123":
if char.isalpha():
print(char, end="") # print letters only
else:
pass # ignore non-letters (spaces, punctuation, digits)
print() # newline
# Output:
# HelloWorld
Вывод
HelloWorld

В этом примере pass ясно показывает, что всё, кроме букв, мы игнорируем намеренно. Можно было бы вовсе убрать else: pass, и программа работала бы так же, но с ним ваш замысел понятен другим читателям.


Что такое конструкция for-else в Python?

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

Поначалу это сбивает с толку, ведь обычно else означает «если условие оказалось False». Но в циклах читайте его как «а если break так и не сработал». Если цикл прошёл все итерации и ни разу не дошёл до break, выполняется else.

for-else, когда искомое найдено (срабатывает break)
# Search for a number - found case
numbers = [3, 7, 2, 9, 4]
target = 9
for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} was not found.")
# Output:
# Found 9!
Вывод
Found 9!

Цикл нашёл 9, поэтому сработал break, а блок else был пропущен. Блок else выполняется, только если цикл дошёл до конца без прерываний.

for-else, когда искомое НЕ найдено (срабатывает else)
# Search for a number - not found case
numbers = [3, 7, 2, 9, 4]
target = 6
for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} was not found.")
# Output:
# 6 was not found.
Вывод
6 was not found.

На этот раз цикл проверил все числа и так и не нашёл 6. Поскольку break ни разу не сработал, выполнился блок else. Такой приём заменяет распространённый шаблон с логическим флагом вроде found = False.

Без for-else (нужен флаг)
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-else (чище)
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

Посмотрим, как эти три инструкции работают вместе в более жизненном примере. Этот код обрабатывает пачку заказов и по-разному реагирует на разные ситуации.

break, continue и pass в деле
# Processing orders
orders = [
{"id": 1, "item": "Laptop", "status": "pending"},
{"id": 2, "item": "Mouse", "status": "shipped"},
{"id": 3, "item": "Keyboard", "status": "cancelled"},
{"id": 4, "item": "Monitor", "status": "pending"},
{"id": 5, "item": "STOP", "status": "system"},
{"id": 6, "item": "Headphones", "status": "pending"},
]
for order in orders:
# Stop processing if we hit a system command
if order["item"] == "STOP":
print("System halt received. Stopping.")
break
# Skip already-handled orders
if order["status"] in ["shipped", "cancelled"]:
continue
# Process pending orders
print(f"Processing order #{order['id']}: {order['item']}")
# Output:
# Processing order #1: Laptop
# Processing order #4: Monitor
# System halt received. Stopping.
Вывод
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 (или наоборот).

Упражнение 1: найдите первое отрицательное число
Напишите код

С помощью цикла for и break найдите и выведите первое отрицательное число в списке. Выведите «Found:», пробел и само число.

Ожидаемый вывод:

Found: -3
numbers = [4, 7, 2, -3, 8, -1, 5]
# Find and print the first negative number using break
Упражнение 2: выведите слово без гласных
Напишите код

С помощью цикла for и continue выведите все символы строки "beautiful", пропуская гласные (a, e, i, o, u). Выводите каждую согласную на одной строке с помощью end="".

Ожидаемый вывод:

btfl

Не забудьте в конце вызвать пустой print(), чтобы аккуратно перейти на новую строку.

word = "beautiful"
# Print each character, but skip vowels using continue
print() # newline at the end
Упражнение 3: предскажите вывод
Угадайте вывод

Не запуская код, предскажите, что именно он выведет. Пройдите по каждой итерации и подумайте, когда срабатывают continue и break.

Затем запустите код и проверьте свой ответ.

for i in range(1, 8):
if i == 3:
continue
if i == 6:
break
print(i)
Упражнение 4: исправьте ошибку в сумме до первого отрицательного
Исправьте ошибку

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

Sum before negative: 15

Не меняйте ничего, кроме одного неправильного ключевого слова.

numbers = [5, 3, 7, -2, 8, 4]
total = 0
for num in numbers:
if num < 0:
continue # BUG: this should stop, not skip!
total += num
print(f"Sum before negative: {total}")
Упражнение 5: проверка пароля с помощью for-else
Напишите код

С помощью конструкции for-else проверьте, есть ли в пароле хотя бы одна цифра. Переберите все символы пароля. Если нашлась цифра, выведите "Password accepted" и прервите цикл через break. Если цикл закончился, а цифра так и не нашлась, выведите "Password must contain a number".

Ожидаемый вывод для заданного пароля:

Password accepted
password = "hello5world"
# Check if password contains at least one digit using for-else

Итоги: break, continue, pass

Краткая шпаргалка по всем трём инструкциям управления циклом:

ИнструкцияЧто делаетКогда использовать
breakНемедленно завершает циклНашли то, что искали, или сработало условие остановки
continueПереходит к следующей итерацииТекущий элемент не нужно обрабатывать
passНичего не делает (заглушка)Пустой блок, который вы заполните позже
for-elseelse выполняется, если не было breakПоиск: «нашли» или «не нашли»

Главные правила:

  • break останавливает ВЕСЬ цикл, а не одну итерацию
  • continue пропускает только ТЕКУЩУЮ итерацию, а цикл продолжается
  • pass служит только заглушкой и ничего не делает
  • во вложенных циклах break выходит только из самого внутреннего
  • else в for-else выполняется, когда цикл завершился БЕЗ break
  • не путайте continue (пропустить один элемент) с break (остановить всё)
  • Что дальше?

    Теперь вы умеете точно управлять ходом цикла. Следующая тема: [вложенные циклы в Python](/python/python-nested-loops). Вы научитесь помещать циклы внутрь других циклов, чтобы работать с сетками, комбинациями и многомерными данными. Вложенные циклы вместе с break и continue открывают дорогу к мощным приёмам.

    Похожие уроки

    Урок был полезен?