Циклы while и for в Python: накопление суммы и произведения, вложенные циклы
Зачем нужны циклы
Циклическая конструкция позволяет многократно повторять одну и ту же группу действий (тело цикла) без дублирования кода вручную. Без циклов для обработки, например, ста чисел пришлось бы сто раз буквально копировать одни и те же строки кода; с циклом достаточно один раз описать действие и указать правило повторения. В языке Python есть два вида циклов: while — цикл с условием (число повторений заранее неизвестно, повторение продолжается, пока условие истинно) и for — цикл со счётчиком, чаще всего используемый для перебора элементов последовательности (диапазона чисел, строки, списка).
Цикл while
Синтаксис цикла while: пока указанное логическое условие истинно, выполняется тело цикла; как только условие становится ложным, цикл завершается, и управление передаётся следующей за циклом строке программы. Условие проверяется перед каждым повторением тела цикла (в том числе перед самым первым), поэтому если условие изначально ложно, тело цикла не выполнится ни разу.
n = 1
while n <= 5:
print(n)
n = n + 1
print("Цикл завершён")
Эта программа выведет числа от 1 до 5, а затем строку «Цикл завершён». Критически важно, чтобы внутри тела цикла переменная, от которой зависит условие (в примере — n), изменялась таким образом, чтобы рано или поздно условие стало ложным — иначе цикл никогда не завершится (так называемое зацикливание, «бесконечный цикл»), что нарушает свойство результативности алгоритма.
Цикл for и функция range()
Цикл for в Python предназначен для перебора элементов некоторой последовательности — чаще всего диапазона чисел, порождаемого встроенной функцией range(). Вызов range(a, b) порождает последовательность целых чисел от a до b−1 включительно (само значение b в последовательность не входит); вызов range(b) с одним аргументом равносилен range(0, b) — перебору от 0 до b−1; вызов range(a, b, шаг) добавляет управление шагом перебора (по умолчанию шаг равен 1).
for i in range(1, 6):
print(i)
print("Цикл завершён")
Эта программа выводит те же числа 1, 2, 3, 4, 5, что и предыдущий пример с while, но записана компактнее — for сам управляет переменной-счётчиком i, поэтому не нужно вручную писать строку изменения счётчика внутри тела цикла, как это требовалось для while.
Пример перебора с нестандартным шагом — вывод чётных чисел от 2 до 10:
for i in range(2, 11, 2):
print(i)
Накопление суммы
Одна из самых распространённых задач с циклами — накопление суммы: последовательное прибавление значений (вводимых пользователем, генерируемых счётчиком или считанных из списка) к переменной-накопителю, которую заранее обнуляют до начала цикла. Общий шаблон: завести переменную-сумму, присвоить ей начальное значение 0 (нейтральный элемент сложения), затем в цикле на каждом шаге прибавлять к ней новое слагаемое.
total = 0
for i in range(1, 101):
total = total + i
print("Сумма чисел от 1 до 100:", total)
Программа выведет 5050 — сумму всех целых чисел от 1 до 100 (что можно проверить и по формуле арифметической прогрессии: S=(1+100)·100/2=5050, результаты совпадают).
Аналогичный шаблон применяется, когда данные вводит пользователь, а не порождает range(), но число повторений заранее неизвестно (используется признак окончания ввода, например число 0):
total = 0
x = int(input("Введите число (0 для завершения): "))
while x != 0:
total = total + x
x = int(input("Введите число (0 для завершения): "))
print("Сумма введённых чисел:", total)
Накопление произведения
По аналогии с суммой строится накопление произведения: переменную-накопитель нужно инициализировать значением 1 (нейтральный элемент умножения, а не 0 — если начать с 0, всё произведение навсегда обнулится после первого же умножения). Классический пример — вычисление факториала числа n (произведения всех целых чисел от 1 до n):
n = int(input("Введите число n: "))
factorial = 1
for i in range(1, n + 1):
factorial = factorial * i
print("Факториал числа", n, "равен", factorial)
Проверка. Для n=5: factorial последовательно принимает значения 1, 1·1=1, 1·2=2, 2·3=6, 6·4=24, 24·5=120. Программа выведет «Факториал числа 5 равен 120», что совпадает с определением 5!=1·2·3·4·5=120.
Вложенные циклы
Вложенным называют цикл, тело которого содержит другой цикл (внутренний). При каждом одном проходе внешнего цикла внутренний цикл выполняется целиком, от начала до конца, — поэтому если внешний цикл повторяется m раз, а внутренний n раз, тело внутреннего цикла в сумме выполнится m·n раз. Вложенные циклы применяются, например, для перебора всех пар значений (двумерные таблицы, координатные сетки, задачи на пары чисел).
Пример — вывод таблицы умножения от 1×1 до 5×5:
for i in range(1, 6):
for j in range(1, 6):
print(i * j, end="\t")
print()
Внешний цикл перебирает номер строки i от 1 до 5, а вложенный внутренний цикл для каждого фиксированного i перебирает номер столбца j от 1 до 5 и выводит произведение i·j; символ табуляции (\t) разделяет числа в строке, а пустой вызов print() после внутреннего цикла осуществляет переход на новую строку таблицы.
Пример: подсчёт количества делителей числа с вложенным циклом
Задача. Дано целое число N. Определить количество его натуральных делителей и вывести их список.
Решение. Перебираем все числа от 1 до N и для каждого проверяем, делится ли N на него без остатка (используем операцию % — остаток от деления); если остаток равен нулю — число является делителем.
n = int(input("Введите число N: "))
count = 0
divisors = []
for d in range(1, n + 1):
if n % d == 0:
count = count + 1
divisors.append(d)
print("Количество делителей:", count)
print("Делители:", divisors)
Проверка. Для N=12 делителями являются 1, 2, 3, 4, 6, 12 — всего 6 делителей. Программа переберёт числа от 1 до 12, отберёт по условию n % d == 0 именно эти шесть чисел и выведет «Количество делителей: 6» и «Делители: [1, 2, 3, 4, 6, 12]», что совпадает с ручной проверкой.
Сравнение циклов while и for
| Признак | while | for |
|---|---|---|
Число повторений | заранее неизвестно, зависит от условия | заранее известно (диапазон/длина коллекции) |
Типичное применение | ввод данных до особого признака, ожидание события | перебор диапазона чисел, элементов списка/строки |
Риск бесконечного цикла | выше — нужно вручную следить за изменением условия | ниже — диапазон конечен по построению |
Типичные ошибки
Самая частая ошибка — забыть инициализировать переменную-накопитель перед циклом (сумму — нулём, произведение — единицей) или, наоборот, вынести инициализацию внутрь цикла, из-за чего накопитель обнуляется на каждом шаге вместо накопления. Вторая ошибка — использовать 0 как начальное значение для накопления произведения вместо 1, что обнуляет весь результат. Третья ошибка — в цикле while забыть изменить переменную, от которой зависит условие продолжения цикла, что приводит к бесконечному циклу. Четвёртая ошибка — при работе с range(a, b) забывать, что значение b в перебор не включается, и получать результат, «не дотягивающий» на одну итерацию до ожидаемого.
Краткий словарь терминов
Цикл — конструкция многократного повторения группы действий (тела цикла).
Цикл while — цикл с предусловием: повторяется, пока истинно логическое условие.
Цикл for — цикл, перебирающий элементы заданной последовательности (диапазона, списка, строки).
Накопление — техника последовательного построения суммы, произведения или иного результата в переменной-накопителе внутри цикла.
Вложенный цикл — цикл, тело которого содержит другой (внутренний) цикл.
range() — встроенная функция Python, порождающая последовательность целых чисел для перебора в цикле for.
Бесконечный цикл — ошибка, при которой условие цикла while никогда не становится ложным.
Заключение
Циклы while и for — основной инструмент обработки повторяющихся действий и массивов данных в программировании: с их помощью строятся накопление суммы и произведения, перебор элементов списков и таблиц, вложенные конструкции для работы с парами значений. Вместе с линейными и разветвляющимися программами циклы завершают набор базовых средств, необходимых для написания практически любой программы на Python, а дальнейшее развитие этих навыков связано с изучением функций, более сложных структур данных и алгоритмов их обработки.



