2.3 Условный цикл#
Синтаксис условного цикла#
Помимо самой условной конструкции и тернарного оператора, условие может встретиться и в цикле, такой цикл мы будем называть условным, а использовать его будем каждый раз, когда текущую задачу можно описать фразой «выполнять … пока не …». То есть условный цикл предполагает выполнение блока инструкций (тела цикла), пока указанное условие будет возвращать значение True. Блоки инструкций, относящиеся к условному циклу, будут определяться так же, как и блоки инструкций в условиях - с помощью отступов. Данное правило будет справедливо и для любых других конструкций, требующих выделения блоков инструкций.
Минимальный синтаксис условного цикла выглядит следующим образом:
while Условие:
Блок инструкций 1
Рассмотрим, как цикл будет выглядеть на некотором реальном примере: «Представим, что в течение рабочего дня каждый час мы должны отмечать в журнале, что мы сейчас заняты работой, а как только мы отработаем 8 часов, нужно оставить отметку, что мы завершили работу.»
Представляя данную задачу в виде алгоритма мы получим примерно следующее:
Выполняем «отметить в журнале, что мы заняты работой», пока не прошло 8 часов
Выполняем «отметить в журнале, что мы завершили работу»
Для программной реализации такого алгоритма нам понадобится переменная, в которой мы будем считать, сколько часов уже отработано. Для условного цикла это стандартная ситуация, что перед циклом необходимо определить некоторую переменную, которая дальше фигурирует в условии и изменяется в самом теле цикла.
hours_worked = 0
while hours_worked < 8:
hours_worked += 1
print("Hour №", hours_worked, "I'm working")
# После выполнения последней инструкции в теле цикла мы возвращаемся к проверке условия
# Одно выполнение тела цикла называется итерацией
print("Hour №", hours_worked, "I finished work")
print("----------------------")
print("End of the working day")
Hour № 1 I'm working
Hour № 2 I'm working
Hour № 3 I'm working
Hour № 4 I'm working
Hour № 5 I'm working
Hour № 6 I'm working
Hour № 7 I'm working
Hour № 8 I'm working
Hour № 8 I finished work
----------------------
End of the working day
В циклах, как и в условии, есть необязательный блок else. В циклах он отвечает за то, что нужно выполнить, когда условие цикла вернуло False. Однако если цикл будет прерван в процессе, то он не вернет False и else исполняться не будет.
В контексте рассматриваемого примера в блок else можно перенести команду, которая оповещает о конце работы (если нашу работу прервет пожар, то мы не будем оставлять отметку о конце работы в журнале).
hours_worked = 0
while hours_worked < 8:
hours_worked += 1
print("Hour №", hours_worked, "I'm working")
else:
print("Hour №", hours_worked, "I finished work")
print("----------------------")
print("End of the working day")
Hour № 1 I'm working
Hour № 2 I'm working
Hour № 3 I'm working
Hour № 4 I'm working
Hour № 5 I'm working
Hour № 6 I'm working
Hour № 7 I'm working
Hour № 8 I'm working
Hour № 8 I finished work
----------------------
End of the working day
Инструкции управления циклом#
Для решения некоторых задач требуется контролировать выполнение цикла, вовремя пропускать отдельные итерации или в целом прерывать цикл. Для этого используются специальные инструкции:
continue - прервать итерацию
break - прервать цикл
Для практического примера использования этих инструкций добавим пару условий к нашей задаче.
Добавим условие, что, когда прошло 4 часа, мы можем сделать перерыв и нам не нужно вносить отметки в журнал (инструкцию можно пропустить)
hours_worked = 0
while hours_worked < 8:
hours_worked += 1
# continue и break в большинстве случаев будут обернуты в условия
if hours_worked == 4:
continue # в этот момент цикл сразу переходит к следующей итерации
print("Hour №", hours_worked, "I'm working")
else:
print("Hour №", hours_worked, "I finished work")
print("----------------------")
print("End of the working day")
Hour № 1 I'm working
Hour № 2 I'm working
Hour № 3 I'm working
Hour № 5 I'm working
Hour № 6 I'm working
Hour № 7 I'm working
Hour № 8 I'm working
Hour № 8 I finished work
----------------------
End of the working day
Добавим условие, что, когда случается «пожар», мы покидаем работу и больше не вносим отметки в журнал.
hours_worked = 0
while hours_worked < 8:
hours_worked += 1
if hours_worked == 4: # допустим, что в этот момент произошел пожар
print("fire")
break # цикл прерывается полностью
print("Hour №", hours_worked, "I'm working")
else: # не будет работать, так как цикл прервался
print("Hour №", hours_worked, "I finished work")
print("----------------------")
print("End of the working day")
Hour № 1 I'm working
Hour № 2 I'm working
Hour № 3 I'm working
fire
----------------------
End of the working day
Бесконечные циклы#
Мы рассмотрели пример условного цикла со всеми возможными его составляющими, где важным моментом было то, что в условии цикла фигурировала переменная, которая изменялась в процессе. Для ряда задач потребуется использовать немного другой подход и в качестве условия передавать значение True, создавая бесконечный цикл. Такие циклы активно используются в алгоритмах, которые постоянно ожидают нового ввода данных. Большинство программ на компьютере, которыми мы пользуемся, - это сложные бесконечные циклы, ожидающие от нас ввода данных, пока их не прервут, то есть не закроют.
Приведем пример такого цикла:
while True:
command = input("Type something:")
if command == "quit":
break
print("You typed:", command)
В случае, если мы запустим бесконечный цикл, не добавив в него условия прерывания, остановить его можно будет только либо закрыв сам процесс исполнения всего скрипта, либо при работе в интерактивном режиме, вызвав прерывание нажатием Ctrl + C
Практические задания