Python: Цикл While
Циклы в программировании
Во многих задачах нужно выполнять одни и те же действия несколько раз. Например, искать в книге нужную фразу: страницу за страницей, пока не найдём совпадение. Сколько раз придётся повторить поиск, заранее неизвестно, но шаг всегда одинаковый — открыть страницу и проверить её.
В программировании такие повторения описываются с помощью циклов. Они позволяют записать один раз действие, которое будет выполняться снова и снова, пока выполняется условие.
Первый пример
Начнём с самой простой задачи. Пусть нужно несколько раз вывести одну и ту же строку "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):
i = 1
while i <= n:
print(i)
i = i + 1
print("Finished!")
print_numbers(3)
# => 1
# => 2
# => 3
# => Finished!
Цикл while
управляет печатью чисел. Когда условие перестаёт выполняться (i
становится больше n
), выполнение выходит из цикла и продолжается строкой print("Finished!")
.
Задание
Модифицируйте функцию print_numbers()
так, чтобы она выводила числа в обратном порядке. Для этого нужно идти от верхней границы к нижней. То есть счётчик должен быть инициализирован максимальным значением, а в теле цикла его нужно уменьшать до нижней границы.
Пример вызова и вывода:
print_numbers(4)
4
3
2
1
finished!
Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import index
from hexlet.test import expect_output
def test1(capsys):
index.print_numbers(2)
expect_output(capsys, "2\n1\nfinished!")
def test2(capsys):
index.print_numbers(4)
expect_output(capsys, "4\n3\n2\n1\nfinished!")
Решение учителя откроется через:
20:00
