2.3 Условный цикл#

Синтаксис условного цикла#

Помимо самой условной конструкции и тернарного оператора, условие может встретиться и в цикле, такой цикл мы будем называть условным, а использовать его будем каждый раз, когда текущую задачу можно описать фразой «выполнять … пока не …». То есть условный цикл предполагает выполнение блока инструкций (тела цикла), пока указанное условие будет возвращать значение True. Блоки инструкций, относящиеся к условному циклу, будут определяться так же, как и блоки инструкций в условиях - с помощью отступов. Данное правило будет справедливо и для любых других конструкций, требующих выделения блоков инструкций.

Минимальный синтаксис условного цикла выглядит следующим образом:

while Условие:
    Блок инструкций 1

Рассмотрим, как цикл будет выглядеть на некотором реальном примере: «Представим, что в течение рабочего дня каждый час мы должны отмечать в журнале, что мы сейчас заняты работой, а как только мы отработаем 8 часов, нужно оставить отметку, что мы завершили работу.»

Представляя данную задачу в виде алгоритма мы получим примерно следующее:

  1. Выполняем «отметить в журнале, что мы заняты работой», пока не прошло 8 часов

  2. Выполняем «отметить в журнале, что мы завершили работу»

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

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 - прервать цикл

Для практического примера использования этих инструкций добавим пару условий к нашей задаче.

  1. Добавим условие, что, когда прошло 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
  1. Добавим условие, что, когда случается «пожар», мы покидаем работу и больше не вносим отметки в журнал.

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