Циклы
В процессе разработки программ часто возникает необходимость многократно выполнять одни те же действия. Например, представим, что мы управляем роботом на клетчатом поле, и за одно действие можем переместить его только на одну клетку. Чтобы сдвинуть его на 5 клеток, нам придется 5 раз повторить команду перемещения:
step = 0
step += 1
print(f"Шагов сделано: {step}")
# Вывод: Шагов сделано: 1
step += 1
print(f"Шагов сделано: {step}")
# Вывод: Шагов сделано: 2
step += 1
print(f"Шагов сделано: {step}")
# Вывод: Шагов сделано: 3
step += 1
print(f"Шагов сделано: {step}")
# Вывод: Шагов сделано: 4
step += 1
print(f"Шагов сделано: {step}")
# Вывод: Шагов сделано: 5
Но что если нужно переместить робота на 100 или даже 1000 клеток? Повторять одну и ту же команду столько раз достаточно утомительно. Именно для таких ситуаций в программировании используются циклы – специальные конструкции, позволяющие многократно повторять определенный фрагмент кода, называемый телом цикла, до тех пор, пока не будет выполнено заданное условие.
В Python представлены два основных вида циклов: цикл со счетчиком for
, и цикл с предусловием while
. Они существенно упрощают решение задач, связанных с многократным выполнением одинаковых действий.
Цикл со счетчиком for и функция range()
Цикл for
предназначен для перебора элементов в последовательности, поэтому чаще всего его используют в сочетании со встроенной функцией range()
, генерирующую последовательность целых чисел:
for переменная in range(старт, стоп, шаг):
тело_цикла
Здесь переменная
– это счетчик, который на каждой итерации цикла принимает следующее значение из последовательности, генерируемой range()
. Внутри блока тело_цикла
находятся инструкции, которые будут выполнены указанное количество раз.

Термин «итерация» произошёл от латинского слова iteratio, означающего «повторение». Поэтому итерация подразумевает процесс повторного выполнения одной и той же операции. Например, если вы готовите омлет и взбиваете яйца венчиком, то каждое движение венчика – одна итерация процесса взбивания.
Функция range()
Функция range()
генерирует последовательность целых чисел, которую можно использовать для задания диапазонов в цикле for
.
Функция | range(start, stop, step) |
Описание | Создаёт последовательность целых чисел |
Параметры | stop – число, на котором последовательность заканчивается. При этом само это значение в последовательность не входитНеобязательные параметры: start – число, с которого начинается последовательность, по умолчанию start=0 step – число, задающее шаг изменения последовательности, по умолчанию step=1 |
Возвращаемое значение | Последовательность целых чисел |
При указании одного обязательного параметра stop
функция range(stop)
создаёт последовательность чисел от 0
до stop - 1
:
for i in range(10):
print(i, end=" ")
# Вывод: 0 1 2 3 4 5 6 7 8 9
При указании двух параметров start
и stop
функция range(start, stop)
создаёт последовательность чисел от start
до stop - 1
:
for i in range(2, 8):
print(i, end=" ")
# Вывод: 2 3 4 5 6 7
stop
не входит в последовательность чисел, создаваемую функцией range()
, в то время как с числа start
эта последовательность начинается.
При указании всех трёх параметров start
, stop
и step
функция range(start, stop, step)
создаёт последовательность чисел от start
до stop - 1
с шагом step
:
for i in range(2, 11, 2):
print(i, end=" ")
# Вывод: 2 4 6 8 10
Все параметры функции range()
должны быть целыми числами. При этом они могут быть как положительными, так и отрицательными:
for i in range(-6, 9, 2):
print(i, end=" ")
# Вывод: -6 -4 -2 0 2 4 6 8
Если шаг step
отрицательный, то создается убывающая последовательность, поэтому важно соблюдать условие start > stop
:
for i in range(5, 0, -1):
print(i, end=" ")
# Вывод: 5 4 3 2 1
Теперь, используя цикл for
и функцию range()
, перепишем программу управления роботом:
for i in range(1, 6):
print(f"Шагов сделано: {i}")
В результате на экран 5 раз будет выведено сообщение о количестве сделанных шагов без необходимости 5 раз писать функцию print()
:
Шагов сделано: 1
Шагов сделано: 2
Шагов сделано: 3
Шагов сделано: 4
Шагов сделано: 5
Здесь вывод каждой строки на экран соответствует одному выполнению тела цикла, то есть было совершено 5 итераций.
Цикл с предусловием while
Цикл
рименяется тогда, когда заранее неизвестно точное количество необходимых повторений, но известно условие остановки:while
п
while условие:
тело цикла
Этот цикл также называют циклом с предусловием, так как он продолжает работу, пока условие истинно (True
), и останавливается, когда оно становится ложным (False
).
Давайте напишем программу, которая, как эхо, повторяет сообщения пользователя до тех пор, пока он не введет специальную фразу для завершения:
message = input("Скажите что-нибудь")
while message != "Хватит за мной повторять!":
print(message)
message = input()
print("Больше не буду")
# Вывод: Скажите что-нибудь
# Ввод: Привет!
# Вывод: Привет!
# Вывод: Скажите что-нибудь
# Ввод: Как дела?
# Вывод: Как дела?
# Вывод: Скажите что-нибудь
# Ввод: Хватит за мной повторять!
# Вывод: Больше не буду
В этом примере программа запрашивает у пользователя ввод строки. До тех пор, пока введённая строка не совпадает со строкой "Хватит за мной повторять!"
, программа выводит на экран введенное сообщение и снова просит ввести новую строку.
Бесконечный цикл while
Важно обеспечить, чтобы условие цикла while
в какой-то момент становилось ложным, иначе цикл будет выполняться бесконечно, что может привести к зависанию программы:
i = 0
while i >= 0:
i += 1
print(i)
# Вывод: 1
# Вывод: 2
# Вывод: 3
...
Здесь переменная i
увеличивается на каждом шаге, и поскольку она всегда будет больше или равна нулю, цикл никогда не остановится. Чтобы избежать таких ситуаций, важно правильно формулировать условие завершения цикла.
Но бесконечные циклы иногда бывают полезными, например, для ожидания определенного события или обработки потока данных.
Специально можно создать бесконечный цикл с помощью конструкции while True
, сразу вместо условия передав логическое значение True
:
while True:
print("Я хочу сыграть с тобой в игру...")
# Вывод: Я хочу сыграть с тобой в игру...
# Вывод: Я хочу сыграть с тобой в игру...
# Вывод: Я хочу сыграть с тобой в игру...
...
Этот цикл будет бесконечно выводить сообщение на экран. Однако, на практике в таких циклах обычно предусматривается условие выхода с помощью оператора прерывания break
.
Оператор прерывания цикла break
Оператор break
используется для досрочного завершения цикла, независимо от того, выполнилось ли условие завершения самого цикла. Чаще всего break
применяют в бесконечных циклах while
, чтобы обеспечить выход из цикла при наступлении некоторого события.
Рассмотрим игру, в которой первый пользователь загадывает число, а второй пытается его угадать. Игра заканчивается, когда число угадано:
answer = int(input("Загадай число: "))
steps = 0
while True:
steps += 1
guess = int(input("Попробуй угадать число: "))
if guess < answer:
print("Загаданное число больше!")
elif guess > answer:
print("Загаданное число меньше!")
else:
print("Поздравляем! Вы выиграли!")
break
print(f"Количество попыток: {steps}")
# Вывод: Загадай число:
# Ввод: 10
# Вывод: Попробуй угадать число:
# Ввод: 5
# Вывод: Загаданное число больше!
# Вывод: Попробуй угадать число:
# Ввод: 10
# Вывод: Поздравляем! Вы выиграли!
- Первый пользователь загадывает и вводит число, которое присваивается переменной
answer
. Переменнаяsteps
предназначена для подсчёта количества попыток. - В бесконечном цикле
while True
на каждой итерации второму пользователю предлагается ввести предположениеguess
. Затем введённое число сравнивается с загаданным:- Если
guess < answer
: выводится подсказка"Загаданное число больше!"
. - Если
guess > answer
: выводится подсказка"Загаданное число меньше!"
. - Если
guess == answer
: выводится поздравление, и цикл досрочно завершается с помощью оператораbreak
.
- Если
- После выхода из цикла на экран выводится количество попыток, затраченных на угадывание числа.
При выходе из цикла с помощью break
дальнейшие инструкции внутри цикла не выполняются, и управление передается на первую строку кода, следующую за циклом.
Оператор пропуска итерации в цикле continue
Прервать можно не только весь цикл, но и текущую итерацию с помощью оператора continue
. Он позволяет пропустить оставшуюся часть текущего выполнения тела цикла и перейти к следующей итерации цикла. Это может быть полезно, когда нужно пропустить определённые случаи и продолжить обработку оставшихся элементов.
Допустим, нам нужно вывести на экран все числа от 1 до 50, кроме тех, которые делятся на 2 или на 3 без остатка:
for i in range(1, 51):
if i % 2 == 0 or i % 3 == 0:
continue
print(i, end=" ")
# Вывод: 1 5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49
- В цикле
for
мы проходим по всем числам от1
до50
включительно. - Для каждого числа проверяем, делится ли оно на
2
или на3
без остатка. - Если условие выполняется, текущая итерация прерывается оператором
continue
, и управление возвращается обратно в начало цикла для следующей итерации. Таким образом, оставшаяся инструкцияprint(i, end=" "))
не выполняются для чисел, удовлетворяющих условию. - Если число не делится без остатка на
2
или3
, оно выводится на экран.
Блок кода после завершения цикла else
Циклы for
и while
в Python могут содержать необязательный блок else
, который выполняется, если цикл был завершён естественным образом, а не прерван оператором break
.
В цикле for
блок else
выполняется, если все элементы последовательности были обработаны:
for i in range(1, 4):
print(i, end=" ")
else:
print("Цикл завершился")
# Вывод: 1 2 3 Цикл завершился
В цикле while
блок else
выполняется, если условие стало ложным:
i = 1
while i < 4:
print(i, end=" ")
i += 1
else:
print("Цикл завершился")
# Вывод: 1 2 3 Цикл завершился
Но если цикл был прерван оператором break
, блок else
не выполняется:
i = 1
while i < 4:
print(i, end=" ")
i += 1
if i == 3:
print("Цикл прерван оператором break")
break
else:
print("Выполнение блока else: цикл завершился")
# Вывод: 1 2 Цикл прерван оператором break
Блок else
может быть полезен в тех случаях, когда нужно выполнить определённый код после успешного завершения цикла.
Вложенные циклы
Внутри одного цикла можно разместить другой цикл, называемый вложенным. Такие конструкции могут применяться для выполнения сложных задач. Одним из классических примеров использования вложенных циклов является вывод таблицы умножения.
Построим таблицу умножения с помощью вложенного цикла for
:
for i in range(1, 10):
for j in range(1, 10):
print(i * j, end="\t")
print()
- Внешний цикл проходит по строкам таблицы – по значениям переменной
i
. Для каждого значенияi
запускается внутренний цикл. - Внутренний цикл проходит по столбцам таблицы – по переменной
j
. Для каждого значенияj
вычисляется произведениеi * j
, которое выводится на экран. - После окончания внутренней итерации внешний цикл вызывает
print()
без аргумента, чтобы перейти на новую строку.
В результате выполнения этого кода на экран будет выведена таблица умножения:
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
Тот же результат можно получить с использованием вложенного цикла while
:
i, j = 1, 1
while i < 10:
while j < 10:
print(i * j, end="\t")
j += 1
print()
i += 1
j = 1
- Переменным
i
иj
присваиваются начальное значения 1. - Во внешнем цикле проверяется условие
i < 10
, и если оно выполняется, то запускается внутренний цикл. - Во внутреннем цикле проверяется условие
j < 10
, и если оно выполняется, вычисляется произведениеi * j
, которое выводится на экран. - После завершения внутреннего цикла, переменная
i
увеличивается на1
, а переменнаяj
сбрасывается до1
для новой строки. Снова проверяется условиеi < 10
.
Уровень вложенности циклов в Python не ограничен, поэтому их можно использовать для обработки многомерных данных. Однако необходимо стараться минимизировать глубину вложенности там, где это возможно, так как её увеличение может негативно сказываться на производительности и читаемости кода.
1. Напишите программу, которая выводит на экран следующие последовательности чисел:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
10, 14, 18, 22, 26
20, 19, 18, 17, 16, 15
2. Напишите программу, которая принимает на вход целые числа, пока не будет введена строка "Стоп"
или "Хватит"
, после чего вычисляет и выводит на экран сумму введённых чисел.
Пример входных данных | Пример выходных данных |
---|---|
1 2 3 Стоп |
6 |
20 21 9 Хватит |
50 |
100 200 Стоп |
300 |
3. Напишите программу, которая принимает на вход целые чётные числа. Когда пользователь вводит нечётное число, программа выводит на экран последнее введённое чётное число, но если нечётным было первое введённое число, то на экран выводится число 0.
Пример входных данных | Пример выходных данных |
---|---|
2 4 7 |
4 |
20 22 25 |
22 |
1 | 0 |
4. Напишите программу, которая принимает на вход целое число n > 1 и выводит на экран наименьшее число, на которое оно делится без остатка и отличное от единицы.
Пример входных данных | Пример выходных данных |
---|---|
17 | 17 |
123 | 3 |
55 | 5 |
5. Напишите программу, которая принимает на вход целое число n и в одну строку через пробел выводит на экран все нечётные числа от 1 до n включительно, кроме чисел от 11 до 21 включительно.
Пример входных данных | Пример выходных данных |
---|---|
34 | 1 3 5 7 9 11 21 23 25 27 29 31 33 |
14 | 1 3 5 7 9 |
25 | 1 3 5 7 9 23 25 |
6. Напишите программу, которая принимает на вход целое число n и строку s и выводит на экран треугольник с высотой n, сформированный из строк s.
Пример входных данных | Пример выходных данных |
---|---|
3 * |
* * * * * * |
5 # |
# # # # # # # # # # # # # # # |
6 снег |
снег снег снег снег снег снег снег снег снег снег снег снег снег снег снег снег снег снег снег снег снег |