Циклы: while и for

Учим программу повторять действия с помощью циклов while и for — и решаем задачи, которые вручную заняли бы вечность.

Цикл — это конструкция, которая повторяет блок кода много раз. В Python есть два цикла: while и for.

Когда без цикла никак

Представь, что надо вывести числа от 1 до 100. Писать сто строк print? Безумие. А посчитать сумму всех чисел до 1000? Вот тут и спасают циклы: они повторяют действие столько раз, сколько нужно, а кода — всего пара строк. Компьютер не устаёт и не ошибается при повторах, и это его суперсила.

Цикл while: пока условие истинно

Цикл while («пока») повторяет блок, пока условие истинно. Перед каждым повтором он проверяет условие: истинно — выполняет тело и проверяет снова; ложно — выходит из цикла.

i = 1
while i <= 5:
    print("Шаг номер", i)
    i = i + 1     # обязательно меняем i!

print("Цикл закончился")

Вывод:

Шаг номер 1
Шаг номер 2
Шаг номер 3
Шаг номер 4
Шаг номер 5
Цикл закончился

Разберём по шагам. Переменная i начинается с 1. Пока i <= 5, печатаем шаг и увеличиваем i на единицу. Когда i станет 6, условие станет ложным, и цикл закончится. Строка i = i + 1 — самая важная: без неё i навсегда осталась бы единицей, и цикл крутился бы вечно.

В цикле while что-то внутри обязательно должно приближать условие к ложному — иначе получится бесконечный цикл.

Накопление: считаем сумму

Очень частая задача — что-то накопить в цикле. Заводят переменную-«копилку», и на каждом шаге добавляют в неё. Посчитаем сумму чисел от 1 до 5.

summa = 0      # копилка
i = 1
while i <= 5:
    summa = summa + i   # добавляем очередное число
    i = i + 1

print("Сумма чисел от 1 до 5:", summa)

Вывод:

Сумма чисел от 1 до 5: 15

Копилка summa начинается с нуля, и на каждом шаге в неё добавляется i: 1, потом 3, 6, 10, 15. Этот приём «завести копилку и накапливать в цикле» пригодится в сотнях задач.

Трассировка: пройди цикл «руками»

Лучший способ понять цикл — мысленно выполнить его, как это делает компьютер. Этот приём называют трассировкой: ведут табличку, где на каждом шаге записывают значения переменных. Возьмём цикл, считающий сумму 1+2+3. До цикла: summa = 0, i = 1. Проверяем i <= 3 — истина, значит работаем.

Шагii <= 3?summa после шага
11да0 + 1 = 1
22да1 + 2 = 3
33да3 + 3 = 6
44нет — выход6

Когда i стало 4, условие стало ложным, цикл закончился, и в summa осталось 6. Привыкай так «прогонять» циклы в голове или на бумаге — это лучший способ найти ошибку и понять, что именно делает программа. На контрольных трассировка часто помогает решить задачу без компьютера.

Цикл for: перебор по порядку

Когда число повторов известно заранее, удобнее for. Вместе с range он легко перебирает числа. range(1, 6) даёт числа от 1 до 5 (правая граница не входит — важно запомнить!).

for i in range(1, 6):
    print("Привет", i)

Вывод:

Привет 1
Привет 2
Привет 3
Привет 4
Привет 5

Никакого i = i + 1 писать не нужно — for сам меняет i на каждом шаге. Поэтому for удобнее и безопаснее, когда число повторов известно: бесконечный цикл тут почти невозможен.

while или for: что выбрать

Берём forБерём while
число повторов известно заранееповторяем «пока» что-то верно
перебор чисел в диапазонечисло повторов заранее не знаем
«сделай 10 раз»«пока пользователь не введёт стоп»

Попробуй сам

Соберём всё вместе: цикл for напечатает таблицу умножения на 7. Один цикл заменяет десять строк ручной писанины.

n = 7
print("Таблица умножения на", n)

for i in range(1, 11):
    print(n, "x", i, "=", n * i)

Вывод:

Таблица умножения на 7
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70

Поменяй n на 9 — и получишь таблицу на 9, не трогая больше ничего. А попробуй заменить range(1, 11) на range(1, 6) — таблица станет короче. Вот она, мощь циклов: меняешь одну цифру, а работа делается за тебя.

Вложенные циклы: цикл внутри цикла

Один цикл — это сила, а цикл внутри цикла — настоящая магия. Так строят таблицы, сетки, игровые поля. Внешний цикл идёт по строкам, а для каждой строки внутренний цикл проходит по столбцам. Нарисуем «звёздную лесенку», чтобы увидеть это вживую.

for i in range(1, 6):          # внешний: 5 строк
    stroka = ""
    for j in range(i):         # внутренний: i звёздочек
        stroka = stroka + "*"
    print(stroka)

Вывод:

*
**
***
****
*****

Разберём, что произошло. Внешний цикл задаёт номер строки i от 1 до 5. Для каждой строки внутренний цикл добавляет в stroka ровно i звёздочек. В первой строке — одна звезда, во второй — две, и так далее. Вот и лесенка! Вложенные циклы поначалу путают, поэтому правило простое: внутренний цикл полностью отрабатывает на каждом шаге внешнего. Попробуй заменить "*" на "# " или изменить число строк — рисунок поменяется. Именно так, кстати, выводят таблицу умножения целиком (строки и столбцы) и рисуют поля для игр.

Частые ошибки

  • Забыть менять переменную в while. Без i = i + 1 цикл станет бесконечным.
  • Ошибиться с границей range. range(1, 6) — это 1, 2, 3, 4, 5; правая граница не входит.
  • Сбить отступ тела цикла. Как и в if, тело цикла задаётся отступом.
  • Забыть обнулить копилку. Переменную-накопитель задают до цикла, обычно нулём.

Запомни

  • while повторяет, пока условие истинно; внутри нужно менять переменную, иначе цикл зациклится.
  • for с range перебирает числа; правая граница в range не входит.
  • Приём «копилки»: завести переменную до цикла и накапливать в ней.
  • for удобен при известном числе повторов, while — когда повторяем «пока» что-то верно.
Проверьте себя
1. Сколько раз выполнится тело цикла for i in range(1, 6)?
A4 раза
B5 раз
C6 раз
Dбесконечно
2. Почему цикл while может стать бесконечным?
AЕсли в нём есть print
BЕсли внутри ничего не меняет условие в сторону ложности
CЕсли используется range
DЕсли число повторов больше 100
3. Какой цикл удобнее, когда число повторов известно заранее?
Awhile
Bfor
Cоба одинаково неудобны
Dциклы тут не нужны
4. Что выведет код: s = 0; for i in range(1, 4): s = s + i; print(s)?
A3
B6
C4
D10

Закрепите практикой

Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.

Поддержать проект