Циклы в программировании
Во многих задачах нужно выполнять одни и те же действия несколько раз. Например, искать в книге нужную фразу: страницу за страницей, пока не найдём совпадение. Сколько раз придётся повторить поиск, заранее неизвестно, но шаг всегда одинаковый — открыть страницу и проверить её.
В программировании такие повторения описываются с помощью циклов. Они позволяют записать один раз действие, которое будет выполняться снова и снова, пока выполняется условие.
Первый пример
Начнём с самой простой задачи. Пусть нужно несколько раз вывести одну и ту же строку "Hello!"
. Без цикла это пришлось бы делать вручную, повторяя вызовы print()
. С циклом это выглядит так:
counter = 0
while counter < 2:
print("Hello!")
counter = counter + 1
# => Hello!
# => Hello!
Конструкция while
задаёт повторение. Её синтаксис состоит из трёх частей:
- ключевое слово
while
- условие (предикат), стоящее после
while
и проверяемое на каждой итерации - блок кода — тело цикла, которое выполняется, пока условие истинно
Условие после while
проверяется перед каждой итерацией. Если оно истинно (True
), выполняется тело цикла — все строки кода с отступом. Когда выполнение тела завершается, интерпретатор возвращается обратно к проверке условия. Если условие остаётся истинным, цикл повторяется снова. Как только условие становится ложным (False
), цикл останавливается, и программа продолжает работу со строк, которые идут дальше за циклом.
В примере используется переменная counter
. Она играет роль счётчика цикла:
- сначала ей задаётся начальное значение (
counter = 0
), - на каждой итерации значение увеличивается (
counter = counter + 1
), - проверка
counter < 2
определяет, нужно ли продолжать цикл.
Без изменения счётчика условие никогда не станет ложным, и цикл превратится в бесконечный.
Работа цикла по шагам
Старт: counter = 0
Шаг 1. Проверка условия counter < 2
: подставляем 0 < 2
→ истина. Заходим в тело цикла.
Выполняется print("Hello!")
→ на экран выводится Hello!
.
counter = counter + 1
меняет значение: было 0
, стало 1
.
Шаг 2. Возврат к проверке условия counter < 2
: теперь 1 < 2
→ истина. Снова тело цикла.
print("Hello!")
→ выводится Hello!
.
counter = counter + 1
: было 1
, стало 2
.
Шаг 3. Снова проверка counter < 2
: теперь 2 < 2
→ ложь. Цикл прекращается, управление переходит к следующей инструкции после цикла.
Итоговое состояние: counter = 2
. За время работы цикла на экран дважды напечатано Hello!
.
Отступы и продолжение программы
У цикла есть тело — это все строки кода, которые имеют одинаковый отступ после строки с while
.
Как только отступ заканчивается, значит, закончился и цикл.
counter = 0
while counter < 2:
print("Hello!")
counter = counter + 1
print("End of loop")
В этом примере строки с print("Hello!")
и counter = counter + 1
относятся к циклу, потому что у них есть отступ. А строка print("End of loop")
уже без отступа — она выполнится один раз, когда цикл завершится.
Таким образом, отступы показывают, какие строки относятся к циклу, а какие выполняются потом.
Цикл внутри функции
Напишем функцию, которая печатает числа от 1 до заданного аргумента:
def print_numbers(n: int) -> None:
i = 1
while i <= n:
print(i)
i = i + 1
print("Finished!")
print_numbers(3)
# => 1
# => 2
# => 3
# => Finished!
Цикл while
управляет печатью чисел. Когда условие перестаёт выполняться (i
становится больше n
), выполнение выходит из цикла и продолжается строкой print("Finished!")
.