Ключевые вопросы параграфа
- Что такое цикл
while
и как он работает? - Как устроен цикл for и как использовать функцию
range()
? - Как сделать цикл компактнее с помощью моржового оператора
:=
? - Чем отличаются ситуации, в которых лучше применять
while
илиfor
?
Иногда программе нужно многократно выполнять одно и то же действие. Например, запрашивать пароль у пользователя до тех пор, пока он не введёт правильный.
Важно: это учебный пример. В реальных системах пароли шифруются и проверяются вместе с логином.
Если использовать только условные операторы, программа сможет проверить пароль только один раз.Чтобы повторять проверку столько раз, сколько нужно, используется цикл
— он позволяет выполнять код многократно.
1saved_pwd = "right_password"
2pwd = input("Введите пароль для входа: ")
3while pwd != saved_pwd:
4 pwd = input("Введите пароль для входа: ")
5print("Пароль верный. Вход разрешён.")
Как видите, тут мы использовали цикл while
. Давайте разберёмся, как он работает.
Цикл while
Цикл while
выполняет код до тех пор, пока условие остаётся истинным (True
). Как только условие перестаёт выполняться (False
), цикл завершает работу, и программа продолжает выполнение со следующей строки.
Вспомните: в предыдущем параграфе мы разбирали, что результат проверки условий в Python — это логические значения
True
(истина) илиFalse
(ложь). Циклы работают по тем же правилам.
Важно: чтобы избежать бесконечного выполнения, у цикла должно быть условие, которое со временем становится ложным.
Как правильно оформлять циклы в коде?
- Тело цикла (код, который нужно повторять) записывается с отступом в четыре пробела. В Python это обязательное требование: отступы показывают структуру программы.
- Использовать табуляцию (
Tab
) вместо пробелов не рекомендуется — это может вызвать ошибки при выполнении.
Каждый проход по телу цикла называется итерацией.
На каждой итерации Python заново проверяет условие:
- Если условие истинно (
True
), выполняется очередной шаг цикла. - Если ложно (
False
), выполнение переходит к коду после цикла.
В предыдущем примере мы можем вообще обойтись без переменной pwd
, так как она используется только в проверке условия продолжения цикла:
1saved_pwd = "right_password"
2while input("Введите пароль для входа: ") != saved_pwd:
3 pass
4print("Пароль верный. Вход разрешён.")
Что происходит в программе:
- Пользователь вводит пароль.
- Если пароль неправильный, снова появляется приглашение ко вводу.
Как только введён верный пароль, цикл завершается и выполняется следующий код.
Обратите внимание, что внутри тела цикла была использована пустая инструкция
pass
, которая делает ничего. Она нужна для того, чтобы код оставался синтаксически правильным. В Python нельзя оставить тело цикла пустым — это вызовет ошибку.
Поэтому, если действий выполнять не нужно, вставляется pass
как заглушка.
Дальше мы рассмотрим, как сделать цикл ещё компактнее с помощью моржового оператора (:=)
.
Моржовый оператор (:=) в циклах
С версии Python 3.8 в языке появился моржовый оператор (:=)
, или walrus operator.
Он позволяет одновременно:
- присвоить значение переменной,
- использовать это значение в условии цикла.
Благодаря моржовому оператору код становится компактнее: не нужно отдельно запрашивать данные до начала цикла и внутри тела цикла.
Давайте напишем программу, которая будет здороваться со всеми людьми, чьи имена введёт пользователь. Сигнал для остановки — ввод строки «СТОП»:
1name = input("Введите имя: ")
2while name != "СТОП":
3 print(f"Привет, {name}!")
4 name = input("Введите имя: ")
5print("Программа завершена.")
Как работает программа:
- Сначала пользователь вводит имя.
- Если введено не «СТОП», программа печатает приветствие и снова запрашивает имя.
- Если введено «СТОП», цикл заканчивается.
А теперь перепишем программу выше с использования оператора :=.
1while (name := input("Введите имя: ")) != "СТОП":
2 print(f"Привет, {name}!")
3print("Программа завершена.")
Что изменилось:
- Теперь имя запрашивается сразу в условии цикла, а не отдельно до начала цикла и внутри тела цикла.
- Благодаря моржовому оператору из программы были убраны строки, в которых имя считывалось дважды: один раз перед циклом и ещё один раз в теле цикла.
- Теперь имя считывается один раз — прямо во время проверки условия.
Итак, цикл while
удобно использовать тогда, когда заранее не известно, сколько раз нужно повторять действие, — мы просто проверяем условие на каждой итерации.
Но иногда мы заранее знаем, сколько раз должно выполниться действие. В таких случаях проще и удобнее использовать другой тип цикла — цикл for
. Давайте посмотрим, как он устроен.
Цикл for
Цикл for
используется, когда количество итераций заранее известно. Он выполняет код для каждого элемента заданной последовательности.
Обычно в цикле for
используется итерируемая переменная. Чаще всего её называют i
, но можно использовать любое осмысленное имя. На каждой итерации переменная принимает новое значение из диапазона.
Чтобы задать диапазон значений, в Python используется функция range()
.
Строго говоря, range()
— это не функция, а встроенный тип данных (Built-in Type), который создаёт последовательность целых чисел. Подробнее про него можно почитать в документации.
Но для простоты мы будем называть его функцией.
Как работает range()
Функция range()
может принимать от одного до трёх аргументов:
-
range(n)
— создаёт последовательность от0
доn - 1
.
Пример:
range(4) → 0, 1, 2, 3
-
range(k, n)
— создаёт последовательность отk
доn - 1
.
Пример:
range(1, 5) → 1, 2, 3, 4
-
range(k, n, s)
— создаёт последовательность отk
доn - 1
с шагомs
.
Пример:
range(1, 10, 2) → 1, 3, 5, 7, 9
Примеры использования цикла for
В примерах ниже числа мы будем получать от пользователей, с помощью функции input()
.
Пример №1: выведем на экран n целых чисел, начиная с 0
1n = int(input("Введите количество чисел: "))
2for i in range(n):
3 print(i)
Результат работы программы:
Введите количество чисел: 5 0 1 2 3 4
Пример №2: выведем на экран целые числа в диапазоне от k
до n - 1
1k = int(input("Введите начало диапазона: "))
2n = int(input("Введите конец (без включения) диапазона: "))
3for i in range(k, n):
4 print(i)
Результат работы программы:
Введите начало диапазона: 2 Введите конец (без включения) диапазона: 5 2 3 4
Пример №3: выведем на экран целые чётные числа в диапазоне от 0
до n
1n = int(input("Введите конец диапазона: "))
2for i in range(0, n + 1, 2):
3 print(i)
Результат работы программы:
Введите конец диапазона: 5 0 2 4
Пример №4: запустим цикл в обратном порядке
С помощью отрицательного шага можно перебирать числа от большего к меньшему:
1n = int(input("Введите первое число: "))
2for i in range(n, -1, -1):
3 print(i)
Результат работы программы:
Введите первое число: 5 5 4 3 2 1 0
Пример №5: что происходит, если диапазон пустой
Попробуем указать параметры диапазона, в который не попадёт ни одно число. Например, range(1, 5, -1)
или range(10, 1, 2)
.
Как можно видеть, ошибка не произойдёт, а функция range()
просто вернёт пустую последовательность чисел. Если попытаться пройти в цикле по такой пустой последовательности, то не будет выполнено ни одной итерации:
1for i in range(1, 5, -1):
2 print(i)
Обратите внимание: изменение значения итерируемой переменной внутри тела цикла не имеет смысла, так как будет перезаписано на следующей итерации очередным значением из диапазона функции
range()
.
Например, следующий код по-прежнему выведет числа от 0
до n - 1
, несмотря на изменение значения итерируемой переменной в теле цикла:
1n = int(input("Введите n: "))
2for i in range(n):
3 print(i)
4 i = 100
Результат работы программы:
Введите n: 5 0 1 2 3 4
✅ У вас получилось разобраться с циклами?
Оцените, насколько это было понятно — ваша обратная связь помогает нам делать хендбук лучше.
Что дальше
Теперь, когда вы научились использовать циклы while
и for
, а также узнали о моржовом операторе :=
, можно переходить к следующему важному шагу — работе с более сложными структурами повторения действий.
В следующем параграфе вы узнаете:
- что такое вложенные циклы и как их использовать;
- как управлять работой цикла с помощью оператора break;
- как пропускать итерации с помощью оператора continue;
- как работает оператор else после завершения цикла;
После этого вы сможете создавать программы, которые выполняют повторяющиеся действия — от простых счётчиков до анализа списков.
А пока — закрепите материал на практике:
- Отметьте, что урок прочитан при помощи кнопки ниже.
- Пройдите мини-квиз, чтобы проверить, насколько хорошо вы разобрались с условиями и логикой.
- Перейдите к задачам этого параграфа.
- Загляните в гайд по системе проверки, если вы здесь впервые.
Хотите обсудить, задать вопрос или не понимаете, почему код не работает? Мы всё предусмотрели — вступайте в сообщество Хендбука! Там студенты помогают друг другу разобраться.
Ключевые выводы параграфа
- Циклы позволяют выполнять повторяющиеся действия в программе.
- Цикл
while
используется, когда неизвестно количество повторений заранее, но есть условие продолжения работы. - Цикл
for
используется для перебора последовательности значений, часто с помощьюrange()
. - Функция
range()
задаёт диапазон чисел для циклаfor
. - Моржовый оператор
:=
позволяет одновременно присвоить значение переменной и использовать его в условии.