Циклы в языке Python: виды, синтаксис и практика
Циклы в Python нужны, чтобы повторять один и тот же блок кода: перебрать элементы списка, обработать строки файла, повторять запрос, пока пользователь не введет правильное значение. В статье разобраны оба вида циклов (for и while), функции range(), enumerate() и zip(), операторы break, continue и блок else, а в конце собраны задачи с готовыми решениями для самопроверки.

Содержание статьи
Какие циклы есть в Python
В Python всего две конструкции для повторения: for и while. Отдельного цикла с постусловием (do-while), как в C или Pascal, нет, его поведение собирают из while True и break.
| Цикл | Когда повторяет тело | Типичная задача |
|---|---|---|
| for | Для каждого элемента итерируемого объекта | Перебор списка, строки, словаря, файла, диапазона чисел |
| while | Пока условие истинно | Ввод до корректного значения, ожидание события, алгоритмы с заранее неизвестным числом шагов |
Одно повторение тела цикла называют итерацией. Тело цикла выделяется отступом (обычно 4 пробела), фигурных скобок и ключевого слова end в Python нет.
Цикл for: перебор коллекций
Цикл for берет элементы итерируемого объекта по одному и на каждой итерации записывает очередной элемент в переменную цикла. Индексы вручную считать не нужно: интерпретатор сам остановится, когда элементы закончатся.
langs = ['Python', 'Go', 'Rust']
for lang in langs:
print(lang, len(lang))
# Python 6
# Go 2
# Rust 4
Так же перебирают строку (по символам), кортеж, множество, словарь (по ключам) и открытый файл (по строкам). Подробнее о вариантах перебора рассказано в статье про цикл for в Python.
Функция range()
Когда нужно повторить действие определенное число раз или пройти по числам, используют range(start, stop, step). Последнее значение stop в диапазон не входит, шаг может быть отрицательным.
for i in range(5):
print(i, end=' ') # 0 1 2 3 4
print()
for i in range(10, 0, -3):
print(i, end=' ') # 10 7 4 1
range() не создает список в памяти, а выдает числа по требованию, поэтому range(10**9) работает мгновенно.
enumerate() и zip()
Если вместе с элементом нужен его номер, вместо конструкции for i in range(len(lst)) удобнее enumerate(). Для параллельного обхода двух и более последовательностей служит zip(), он останавливается на самой короткой из них.
names = ['Аня', 'Борис', 'Вера']
scores = [91, 78, 85]
for num, name in enumerate(names, start=1):
print(num, name)
for name, score in zip(names, scores):
print(f'{name}: {score}')
Цикл while: повторение по условию
Цикл while проверяет условие перед каждой итерацией и выполняет тело, пока условие истинно. Переменные, от которых зависит условие, нужно менять внутри тела, иначе цикл станет бесконечным.
balance = 1000
years = 0
while balance < 2000:
balance *= 1.1
years += 1
print(years) # 8
Бесконечный цикл while True применяют намеренно: в меню программ, при чтении ввода, в серверах. Выход из него делают через break. Разбор всех вариантов есть на странице про цикл while.
while True:
answer = input('Введите число: ')
if answer.isdigit():
break
print('Это не число, попробуйте еще раз')
print('Получено', int(answer))
Управление циклом: break, continue и else
Три конструкции меняют обычный ход цикла и работают одинаково в for и while:
breakсразу прерывает цикл, выполнение продолжается с первой строки после него;continueпропускает остаток текущей итерации и переходит к следующей;elseпосле цикла выполняется только тогда, когда цикл закончился сам, без break.
nums = [4, 9, 15, 22]
for n in nums:
if n % 2:
continue # нечетные пропускаем
if n > 20:
print('Нашли большое четное:', n)
break
else:
print('Большого четного нет')
Блок else удобен при поиске: он заменяет флаг вида found = False. Больше примеров собрано в материале про операторы break и continue.
Вложенные циклы
Цикл внутри цикла выполняется полностью на каждой итерации внешнего. Так обходят таблицы и матрицы, перебирают пары элементов. Число повторений перемножается: два вложенных цикла по 1000 итераций дают миллион выполнений тела, поэтому на больших данных вложенность быстро становится узким местом.
matrix = [[1, 2, 3], [4, 5, 6]]
for row in matrix:
for value in row:
print(value, end=' ')
print()
Учтите, что break прерывает только тот цикл, в котором написан. Чтобы выйти сразу из обоих, код выносят в функцию и используют return.
Частые ошибки в циклах
- Изменение списка во время его обхода. Удаление элементов внутри
for x in lstприводит к пропуску соседних значений. Собирайте новый список или обходите копиюlst[:]. - Забытое изменение переменной в while. Условие никогда не станет ложным, программа зависнет.
- Ошибка на единицу с range().
range(1, 10)дает числа от 1 до 9, а не до 10. - Цикл там, где хватит встроенной функции. Для суммы, минимума и максимума есть
sum(),min(),max(), а новый список удобнее собрать генератором списка:[x * 2 for x in nums].
Задачи на циклы с решениями
Задачи расположены от простых к более сложным. Сначала попробуйте решить самостоятельно, затем сверьтесь с кодом. Еще больше упражнений есть в сборнике практических задач по циклам.
Задача 1. Сумма элементов списка
Дан список чисел. Посчитайте сумму всех элементов с помощью цикла, не используя sum().
Решение:
numbers = [1, 2, 3, 4, 5]
total = 0
for number in numbers:
total += number
print('Сумма элементов списка:', total) # 15
Задача 2. Минимальное значение
Найдите наименьший элемент списка без функции min(). За стартовое значение возьмите первый элемент.
Решение:
numbers = [5, 2, 7, 4, 1]
min_value = numbers[0]
for number in numbers:
if number < min_value:
min_value = number
print('Минимальное значение в списке:', min_value) # 1
Задача 3. Количество четных чисел
Подсчитайте, сколько четных чисел в диапазоне от 1 до 10 включительно.
Решение:
count = 0
for i in range(1, 11):
if i % 2 == 0:
count += 1
print('Количество четных чисел:', count) # 5
Задача 4. Поиск элемента в списке
Проверьте, есть ли заданное слово в списке, и выведите сообщение. Используйте break и блок else вместо флага.
Решение:
items = ['apple', 'banana', 'orange', 'grape']
search_item = 'banana'
for item in items:
if item == search_item:
print(search_item, 'найден в списке')
break
else:
print(search_item, 'не найден в списке')
Задача 5. Таблица умножения
Выведите таблицу умножения для чисел от 1 до n в виде строк "i x j = результат".
Решение:
n = 5
for i in range(1, n + 1):
for j in range(1, n + 1):
print(i, 'x', j, '=', i * j)
Задача 6. Факториал числа
Вычислите факториал числа n, то есть произведение всех натуральных чисел от 1 до n.
Решение:
def factorial(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
print('Факториал числа 6 равен', factorial(6)) # 720
Задача 7. Простые числа в диапазоне
Выведите все простые числа от start до end. Делители достаточно проверять до квадратного корня из числа.
Решение:
start, end = 10, 30
for num in range(start, end + 1):
if num < 2:
continue
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
break
else:
print(num, end=' ') # 11 13 17 19 23 29
Задача 8. Повторяющиеся элементы
Найдите элементы, которые встречаются в списке больше одного раза, и выведите каждый из них один раз.
Решение:
items = [3, 6, 8, 2, 6, 9, 2, 3]
repeated = []
for item in items:
if items.count(item) > 1 and item not in repeated:
repeated.append(item)
print('Повторяющиеся элементы:', repeated) # [3, 6, 2]
Задача 9. Удаление дубликатов
Постройте новый список без повторов, сохранив порядок первого появления элементов.
Решение:
items = [1, 2, 3, 2, 4, 5, 6, 5]
unique_items = []
for item in items:
if item not in unique_items:
unique_items.append(item)
print('Список без дубликатов:', unique_items)
Задача 10. Числа Фибоначчи
Выведите все числа Фибоначчи, которые меньше n. Каждое следующее число равно сумме двух предыдущих.
Решение:
n = 50
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a + b
# 0 1 1 2 3 5 8 13 21 34
Задача 11. Наибольший общий делитель
Найдите НОД двух чисел по алгоритму Евклида: пока второе число не равно нулю, заменяйте пару (a, b) на (b, a % b).
Решение:
def gcd(a, b):
while b:
a, b = b, a % b
return a
print('НОД чисел 48 и 64 равен', gcd(48, 64)) # 16
Задача 12. Число-палиндром
Проверьте, читается ли число одинаково слева направо и справа налево. Строки не используйте, переворачивайте число арифметикой.
Решение:
def is_palindrome(number):
original, reverse = number, 0
while number > 0:
reverse = reverse * 10 + number % 10
number //= 10
return original == reverse
print(is_palindrome(12321)) # True
Задача 13. Количество цифр в числе
Подсчитайте, сколько цифр в целом положительном числе, отбрасывая по одной последней цифре.
Решение:
number = 123456
count = 0
while number != 0:
number //= 10
count += 1
print('Количество цифр в числе:', count) # 6
Задача 14. Простые множители
Разложите число на простые множители. Делите число на текущий делитель, пока делится без остатка, затем увеличивайте делитель.
Решение:
def prime_factors(n):
factors = []
divisor = 2
while divisor <= n:
if n % divisor == 0:
factors.append(divisor)
n //= divisor
else:
divisor += 1
return factors
print(prime_factors(84)) # [2, 2, 3, 7]
Задача 15. Делители числа
Выведите все делители числа, включая 1 и само число.
Решение:
number = 20
divisors = []
for i in range(1, number + 1):
if number % i == 0:
divisors.append(i)
print('Делители числа', number, ':', divisors) # [1, 2, 4, 5, 10, 20]
Частые вопросы
Ответы на вопросы, которые чаще всего возникают у начинающих при работе с циклами.
Чем отличается for от while?
for перебирает готовую последовательность и сам останавливается, когда элементы закончились. while повторяет тело, пока истинно условие, и подходит, когда число шагов заранее неизвестно.
Есть ли в Python цикл do-while?
Нет. Его заменяют конструкцией while True с проверкой условия в конце тела и выходом через break, тогда тело выполнится хотя бы один раз.
Как пройти по списку в обратном порядке?
Используйте for x in reversed(lst) или срез lst[::-1]. Для чисел подойдет range(10, 0, -1).
Как прервать бесконечный цикл в консоли?
Нажмите Ctrl+C: интерпретатор выбросит исключение KeyboardInterrupt и остановит программу. В коде выход из цикла делают через break или return.
Когда выполняется else у цикла?
Только если цикл завершился естественно: закончились элементы в for или условие while стало ложным. Если сработал break, блок else пропускается.