undo
search menu close

Циклы

📅 17 апреля 2025 г. 0:50

В процессе разработки программ часто возникает необходимость многократно выполнять одни те же действия. Например, представим, что мы управляем роботом на клетчатом поле, и за одно действие можем переместить его только на одну клетку. Чтобы сдвинуть его на 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
# Вывод: Поздравляем! Вы выиграли!
Рассмотрим работу данного кода:
  1. Первый пользователь загадывает и вводит число, которое присваивается переменной answer. Переменная steps предназначена для подсчёта количества попыток.
  2. В бесконечном цикле while True на каждой итерации второму пользователю предлагается ввести предположение guess. Затем введённое число сравнивается с загаданным:
    • Если guess < answer: выводится подсказка "Загаданное число больше!".
    • Если guess > answer: выводится подсказка "Загаданное число меньше!".
    • Если guess == answer: выводится поздравление, и цикл досрочно завершается с помощью оператора break.
  3. После выхода из цикла на экран выводится количество попыток, затраченных на угадывание числа.

При выходе из цикла с помощью 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
Рассмотрим работу данного кода:
  1. В цикле for мы проходим по всем числам от 1 до 50 включительно.
  2. Для каждого числа проверяем, делится ли оно на 2 или на 3 без остатка.
  3. Если условие выполняется, текущая итерация прерывается оператором continue, и управление возвращается обратно в начало цикла для следующей итерации. Таким образом, оставшаяся инструкция print(i, end=" ")) не выполняются для чисел, удовлетворяющих условию.
  4. Если число не делится без остатка на 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()
Рассмотрим работу данного кода:
  1. Внешний цикл проходит по строкам таблицы – по значениям переменной i. Для каждого значения i запускается внутренний цикл.
  2. Внутренний цикл проходит по столбцам таблицы – по переменной j. Для каждого значения j вычисляется произведение i * j, которое выводится на экран.
  3. После окончания внутренней итерации внешний цикл вызывает 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
Здесь происходит следующее:
  1. Переменным i и j присваиваются начальное значения 1.
  2. Во внешнем цикле проверяется условие i < 10, и если оно выполняется, то запускается внутренний цикл.
  3. Во внутреннем цикле проверяется условие j < 10, и если оно выполняется, вычисляется произведение i * j, которое выводится на экран.
  4. После завершения внутреннего цикла, переменная 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
снег
снег
снег снег
снег снег снег
снег снег снег снег
снег снег снег снег снег
снег снег снег снег снег снег
 
Ответ
arrow_back_ios Назад
Дальше arrow_forward_ios

 💬 0 комментариев
person
email