Урок 5. Циклы while и for
Цикл повторяет блок команд несколько раз. Вывести числа от 1 до 100, сложить тысячу значений, спрашивать пароль, пока не введут верный, — всё это циклы. В Python их два: while повторяет, пока выполняется условие, for перебирает значения по очереди.
Цикл while
n = 1
while n <= 5:
print(n)
n += 1
print("Готово")1
2
3
4
5
Готовоwhile проверяет условие. Если оно истинно — выполняет блок с отступом и снова проверяет условие. Как только условие стало ложным, программа идёт дальше, к строке после цикла. Одно выполнение блока называют итерацией или шагом цикла.
Внутри цикла должно меняться что-то, от чего зависит условие. Если убрать строку n += 1, n навсегда останется равным 1, и цикл станет бесконечным: программа будет печатать единицы, пока её не остановят. Остановить программу можно клавишами Ctrl+C в терминале и в IDLE или кнопкой остановки в Thonny.
Пример — сумма цифр числа. Последняя цифра — остаток от деления на 10, а n //= 10 отбрасывает её:
n = int(input())
total = 0
while n > 0:
total += n % 10
n //= 10
print(total)20248Цикл for и range
Когда заранее известно, сколько раз повторить, удобнее for. Функция range даёт ряд целых чисел:
for i in range(5):
print(i)0
1
2
3
4for 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).
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 перебирает не только числа. Строку он проходит по одной букве:
for letter in "Минск":
print(letter)М
и
н
с
кТак же for перебирает элементы списка — об этом в уроке Списки.
Накопление: сумма и произведение
Частый приём: завести переменную до цикла и на каждом шаге добавлять к ней значение.
total = 0
for i in range(1, 101):
total += i
print(total)5050Произведение считают так же, только начинают с 1, а не с 0. Пример — факториал: 5! = 1 × 2 × 3 × 4 × 5.
n = int(input())
fact = 1
for i in range(1, n + 1):
fact *= i
print(fact)5120Вложенные циклы
Внутри цикла может стоять другой цикл. Внутренний проходит целиком на каждом шаге внешнего:
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. Так удобно читать числа, пока не введут ноль:
total = 0
while True:
x = int(input())
if x == 0:
break
total += x
print("Сумма:", total)5
3
10
0Сумма: 18continue — пропустить число, кратное трём:
for n in range(1, 11):
if n % 3 == 0:
continue
print(n, end=" ")
print()1 2 4 5 7 8 10Подробнее, в том числе как выйти сразу из двух вложенных циклов, — в справке Как выйти из цикла: break и continue.
Какой цикл выбрать
for— когда известно, сколько повторений, или нужно перебрать все элементы строки или списка.while— когда повторять нужно, пока что-то не случится: пока не введут верный пароль, пока число больше нуля.
Любой for с range можно переписать через while, но for короче и в нём труднее ошибиться: не нужно самим менять счётчик.
Коротко
while условие:повторяет блок, пока условие истинно; внутри должно меняться то, от чего оно зависит.for i in range(a, b):перебирает числа отaдоb - 1;range(n)— от 0 доn - 1.range(a, b, шаг)— с шагом, отрицательный шаг — по убыванию.- Сумму начинают с 0, произведение — с 1.
break— выйти из цикла,continue— перейти к следующему шагу; зависшую программу останавливаетCtrl+C.