Циклы в программировании
Во многих задачах нужно выполнять одни и те же действия несколько раз. Например, искать в книге нужную фразу: страницу за страницей, пока не найдём совпадение. Сколько раз придётся повторить поиск, заранее неизвестно, но шаг всегда одинаковый — открыть страницу и проверить её.
В программировании такие повторения описываются с помощью циклов. Они позволяют записать один раз действие, которое будет выполняться снова и снова, пока выполняется условие.
Первый пример
Начнём с самой простой задачи. Пусть нужно несколько раз вывести одну и ту же строку "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!").