Циклы: 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 — истина, значит работаем.
| Шаг | i | i <= 3? | summa после шага |
| 1 | 1 | да | 0 + 1 = 1 |
| 2 | 2 | да | 1 + 2 = 3 |
| 3 | 3 | да | 3 + 3 = 6 |
| 4 | 4 | нет — выход | 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— когда повторяем «пока» что-то верно.
Закрепите практикой
Задачи с автоматической проверкой — решайте прямо здесь, не уходя из учебника.