Ключевые вопросы параграфа
- Что такое вложенные циклы и как они работают?
- Как прерывать цикл с помощью оператора break?
- Как использовать флаги для остановки вложенных циклов?
- Как пропускать итерации с помощью оператора continue?
- Как работает оператор else в циклах и чем на него влияет break?
Вложенные циклы
Иногда для решения задачи требуется использовать один цикл внутри другого. Такие конструкции называются вложенными циклами.
Например: нужно сгенерировать все возможные комбинации из двух строчных букв английского алфавита.
Вот как это можно сделать:
1for i in range(26):
2 for j in range(26):
3 print(f"{chr(ord('a') + i)}{chr(ord('a') + j)}")
Как работает программа:
- Сначала запускается внешний цикл. Он отвечает за первую букву и фиксирует значение переменной i, которая определяет смещение относительно буквы a.
- Для каждой итерации внешнего цикла запускается внутренний цикл, который перебирает вторую букву, изменяя значение переменной j.
- За одну итерацию внешнего цикла внутренний цикл успевает пройти все свои значения.
- Процесс повторяется, пока все свои итерации не совершит внешний цикл.
Внутри функции print()
использованы известные нам функции chr()
и ord()
.
Функция ord()
использована для возврата кода начальной буквы алфавита («a»), к нему прибавляется текущее смещение, задаваемое итерируемыми переменными i
и j
. А далее для полученных кодов функция chr()
возвращает буквы.
Циклы могут иметь большую степень вложенности. При этом общее количество итераций равно произведению количества итераций всех циклов.
Например, в приведённой программе выполняется 26 × 26 = 676 итераций.
Важно помнить: вложенные циклы увеличивают время выполнения программы. Поэтому следует внимательно относиться к выбору алгоритма и не использовать вложенные циклы, если есть возможность решить задачу без них.
Оператор break
Циклы for
и while
можно остановить досрочно при наступлении определённого условия. Для этого используется оператор break.
Пример: остановка бесконечного цикла
1password = "right_password"
2while True:
3 if input("Введите пароль: ") == password:
4 print("Пароль принимается")
5 break
Как работает программа:
- Запускается бесконечный цикл
while
True
. - На каждой итерации программа запрашивает ввод пароля.
- Если введённый пароль совпадает с правильным, выводится сообщение:«Пароль принимается» и выполняется
break
, который останавливает цикл.
Если в цикле используется много операторов break
, программа становится сложнее для понимания: трудно сразу определить, при каких условиях цикл завершится.
Поэтому лучше использовать break
только там, где это действительно необходимо.
Оператор break
во вложенных циклах
Если break
используется внутри вложенных циклов, он останавливает только тот цикл, в котором был вызван.
Чтобы остановить внешний цикл, нужно использовать дополнительные конструкции, например флаг.
Пример: сгенерировать двухбуквенные комбинации по алфавиту и остановиться, когда будет получена строка 'ya'.
1flag = False
2for i in range(26):
3 for j in range(26):
4 text = f"{chr(ord('a') + i)}{chr(ord('a') + j)}"
5 if text == "ya":
6 print(text)
7 flag = True
8 break
9 print(text)
10 if flag:
11 break
Флаги для остановки вложенных циклов
В предыдущем примере продолжают использоваться вложенные циклы: перебираются все возможные комбинации букв. Генерация и вывод происходят без изменений.
Обратите внимание на переменную-флаг flag логического типа (bool). Она используется для передачи сигнала о том, что программа достигла нужной комбинации символов и нужно остановить выполнение внешнего цикла.
Иначе break
внутри вложенного цикла остановит только внутренний цикл, а внешний продолжит работать.
Как работает флаг:
- В начале флаг установлен в значение False (флаг опущен).
- При генерации комбинации 'ya' программа:
- выводит эту комбинацию,
- поднимает флаг (flag = True),
- прерывает внутренний цикл с помощью break.
- После завершения внутреннего цикла проверяется значение флага.
Оператор continue
В циклах for
и while
можно пропустить выполнение оставшейся части тела цикла на текущей итерации и сразу перейти к следующей.
Для этого используется оператор continue
.
При использовании вложенных циклов continue
действует только на тот цикл, в котором он непосредственно находится.
Пример: пропуск одинаковых букв в комбинациях
Перепишем программу так, чтобы не выводить комбинации с одинаковыми буквами, например 'aa'
, 'bb'
и так далее:
1for i in range(26):
2 for j in range(26):
3 if i == j:
4 continue
5 print(f"{chr(ord('a') + i)}{chr(ord('a') + j)}")
Как работает программа:
- Если номера букв i и j совпадают, выполнение текущей итерации внутреннего цикла прерывается командой continue.
- Печать комбинации происходит только в случае, если буквы разные.
Важно: не стоит злоупотреблять использованием операторов break и continue, так как это усложняет понимание структуры программы.
В данном примере можно обойтись и без continue, просто изменив условия.
1for i in range(26):
2 for j in range(26):
3 if i != j:
4 print(f"{chr(ord('a') + i)}{chr(ord('a') + j)}")
Такой код становится чуть проще и читается легче.
Оператор else в циклах
В циклах while
и for
можно использовать оператор else
.
Код, записанный в блоке else
, выполняется в том случае, если цикл завершился естественно:
- для
while
— когда нарушилось условие продолжения, - для for — когда закончились все элементы в последовательности.
Это позволяет задать действия, которые должны выполняться после полного завершения цикла, без использования дополнительных проверок.
Пример: цикл с оператором else
Напишем программу, которая будет запрашивать строки у пользователя до тех пор, пока он не введёт 'СТОП'. После завершения цикла программа выведет сообщение.
1while input("Введите строку (СТОП для остановки): ") != "СТОП":
2 pass
3else:
4 print("Цикл завершён")
Как работает программа:
- На каждой итерации цикл
while
запрашивает ввод строки. - Если пользователь вводит что-то отличное от
'СТОП'
, цикл продолжается. - Как только вводится
'СТОП'
, условие становится ложным, цикл завершает работу, и выполняется код в блокеelse
. - На экран выводится сообщение:
Цикл завершён.
Как оператор break влияет на поведение else
Если в теле цикла используется оператор break
, который преждевременно останавливает цикл, код в else
не будет выполнен.
break
считается досрочным завершением, поэтому Python пропускает выполнение блока else
.
Пример: цикл с break
и else
Перепишем предыдущий пример, добавив проверку: если введённое значение равно "ignore_else"
, то остановим цикл с помощью break
:
1while (text := input("Введите строку (СТОП для остановки): ")) != "СТОП":
2 if text == "ignore_else":
3 break
4else:
5 print("Цикл завершён")
Как работает программа:
- Если пользователь вводит
'СТОП'
, цикл завершается естественно, и блокelse
выполняется — выводится сообщение Цикл завершён. - Если пользователь вводит
'ignore_else'
, срабатывает операторbreak
.
В этом случае цикл завершается немедленно, и код внутри блока else не выполняется.
Таким образом, поведение блока else
напрямую зависит от того, каким образом завершился цикл:
- естественное завершение — код
else
выполняется; - завершение через
break
— кодelse
пропускается.
✅ У вас получилось разобраться со вложенными циклами?
Оцените, насколько это было понятно — ваша обратная связь помогает нам делать хендбук лучше.
👉 Оценить этот параграф
Что дальше
Теперь, когда вы научились использовать вложенные циклы, управлять выполнением кода с помощью break
, continue
, else
и флагов, можно переходить к следующему этапу изучения Python — работе с коллекциями данных и основами управления памятью.
Теперь предлагаем закрепить материал на практике:
- Отметьте, что урок прочитан при помощи кнопки ниже.
- Пройдите мини-квиз, чтобы проверить, насколько хорошо вы разобрались с вложенными циклами и операторами управления.
- Перейдите к задачам этого параграфа.
- Загляните в гайд по системе проверки, если вы здесь впервые.
Хотите обсудить, задать вопрос или не понимаете, почему код не работает? Мы всё предусмотрели — вступайте в сообщество Хендбука! Там студенты помогают друг другу разобраться.
Ключевые выводы параграфа
- Вложенные циклы позволяют перебирать комбинации значений, но увеличивают общее количество итераций и время работы программы.
- Оператор
break
завершает выполнение цикла досрочно. При вложенности он останавливает только тот цикл, в котором вызван. - Флаги (
True
/False
) помогают корректно управлять остановкой вложенных циклов. - Оператор
continue
позволяет пропускать выполнение оставшейся части тела цикла на текущей итерации. - Оператор
else
в циклах выполняет код после естественного завершения цикла, но не срабатывает, если цикл был прерван с помощьюbreak
.