Глиф Учебники

Урок 5. Циклы while и for

Курс «Python» · урок 5 из 10 · 4 минуты чтения

Цикл повторяет блок команд несколько раз. Вывести числа от 1 до 100, сложить тысячу значений, спрашивать пароль, пока не введут верный, — всё это циклы. В Python их два: while повторяет, пока выполняется условие, for перебирает значения по очереди.

Цикл while

Python
n = 1
while n <= 5:
    print(n)
    n += 1
print("Готово")
Вывод
1
2
3
4
5
Готово

while проверяет условие. Если оно истинно — выполняет блок с отступом и снова проверяет условие. Как только условие стало ложным, программа идёт дальше, к строке после цикла. Одно выполнение блока называют итерацией или шагом цикла.

n = 1 n <= 5 да print(n) n += 1 шаг цикла нет print("Готово") n n <= 5 вывод 1 да 1 2 да 2 3 да 3 4 да 4 5 да 5 6 нет Готово
Цикл while проверяет n <= 5, выполняет шаг print(n) и n += 1 и снова проверяет условие; при n = 6 условие ложно, и программа выводит «Готово».

Внутри цикла должно меняться что-то, от чего зависит условие. Если убрать строку n += 1, n навсегда останется равным 1, и цикл станет бесконечным: программа будет печатать единицы, пока её не остановят. Остановить программу можно клавишами Ctrl+C в терминале и в IDLE или кнопкой остановки в Thonny.

Пример — сумма цифр числа. Последняя цифра — остаток от деления на 10, а n //= 10 отбрасывает её:

Python
n = int(input())
total = 0
while n > 0:
    total += n % 10
    n //= 10
print(total)
Ввод
2024
Вывод
8

Цикл for и range

Когда заранее известно, сколько раз повторить, удобнее for. Функция range даёт ряд целых чисел:

Python
for i in range(5):
    print(i)
Вывод
0
1
2
3
4

for i in range(5) — «для каждого i из ряда 0, 1, 2, 3, 4». Переменная i на каждом шаге получает следующее значение. Обратите внимание: ряд начинается с 0, а число 5 в него не входит.

ЗаписьРяд чисел
range(5)0, 1, 2, 3, 4
range(1, 6)1, 2, 3, 4, 5
range(0, 10, 2)0, 2, 4, 6, 8
range(10, 0, -2)10, 8, 6, 4, 2

Третье число — шаг. Отрицательный шаг даёт ряд по убыванию. Второе число в ряд никогда не входит: чтобы дойти до n включительно, пишут range(1, n + 1).

0 1 2 3 4 5 6 7 8 9 10 range(5) 0 1 2 3 4 5 range(1, 6) 1 2 3 4 5 6 range(0, 10, 2) +2 0 2 4 6 8 10 range(10, 0, -2) −2 10 8 6 4 2 0 входит в ряд конец — в ряд не входит
range(начало, конец, шаг) даёт числа от начала с заданным шагом, а конец в ряд не входит: range(5) — это 0…4, range(1, 6) — 1…5, с шагом −2 ряд идёт по убыванию.
Python
for i in range(1, 6):
    print(i, end=" ")
print()
for i in range(10, 0, -2):
    print(i, end=" ")
print()
Вывод
1 2 3 4 5
10 8 6 4 2

В Pascal похожий цикл — for i := 1 to 5 do, и там конец входит в ряд. В Python range(1, 5) даёт только 1, 2, 3, 4 — это частая ошибка у тех, кто переходит с Pascal.

Перебор строки

for перебирает не только числа. Строку он проходит по одной букве:

Python
for letter in "Минск":
    print(letter)
Вывод
М
и
н
с
к

Так же for перебирает элементы списка — об этом в уроке Списки.

Накопление: сумма и произведение

Частый приём: завести переменную до цикла и на каждом шаге добавлять к ней значение.

Python
total = 0
for i in range(1, 101):
    total += i
print(total)
Вывод
5050

Произведение считают так же, только начинают с 1, а не с 0. Пример — факториал: 5! = 1 × 2 × 3 × 4 × 5.

Python
n = int(input())
fact = 1
for i in range(1, n + 1):
    fact *= i
print(fact)
Ввод
5
Вывод
120

Вложенные циклы

Внутри цикла может стоять другой цикл. Внутренний проходит целиком на каждом шаге внешнего:

Python
for i in range(1, 4):
    for j in range(1, 4):
        print(i * j, end=" ")
    print()
Вывод
1 2 3
2 4 6
3 6 9

Внешний цикл задаёт строку таблицы умножения, внутренний — числа в ней. Пустой print() после внутреннего цикла переводит вывод на новую строку.

break и continue

break сразу выходит из цикла, continue пропускает остаток шага и переходит к следующему. Цикл while True сам по себе бесконечный, и выйти из него можно только через break. Так удобно читать числа, пока не введут ноль:

Python
total = 0
while True:
    x = int(input())
    if x == 0:
        break
    total += x
print("Сумма:", total)
Ввод
5
3
10
0
Вывод
Сумма: 18

continue — пропустить число, кратное трём:

Python
for n in range(1, 11):
    if n % 3 == 0:
        continue
    print(n, end=" ")
print()
Вывод
1 2 4 5 7 8 10
continue пропускает остаток шага for n in range(1, 11): if n % 3 == 0: continue print(n, end=" ") пропуск print() следующий шаг break выходит из цикла while True: x = int(input()) if x == 0: break total += x print("Сумма:", total) из цикла
continue пропускает остаток шага и переходит к следующему шагу цикла, а break сразу выходит из цикла к первой строке после него.

Подробнее, в том числе как выйти сразу из двух вложенных циклов, — в справке Как выйти из цикла: break и continue.

Какой цикл выбрать

Любой for с range можно переписать через while, но for короче и в нём труднее ошибиться: не нужно самим менять счётчик.

Коротко

Проверьте себя

1. Какие числа выведет for i in range(2, 6): print(i)?
2. Что выведет программа?
Python
n = 10
while n > 0:
    n -= 3
print(n)
3. С какого значения нужно начать переменную, в которой считается произведение чисел?
4. Что делает continue внутри цикла?