Python: уроки, справочник и задачи

Циклы в языке Python: виды, синтаксис и практика

Раздел: Основы Python · Обновлено 31.10.2026

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

Циклы в языке Python: виды, синтаксис и практика
Фото: Petar Milošević / CC BY-SA 4.0, Wikimedia Commons
Содержание статьи
  1. Какие циклы есть в Python
  2. Цикл for: перебор коллекций
  3. Цикл while: повторение по условию
  4. Управление циклом: break, continue и else
  5. Вложенные циклы
  6. Частые ошибки в циклах
  7. Задачи на циклы с решениями
  8. Частые вопросы

Какие циклы есть в 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:

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.

Частые ошибки в циклах

Задачи на циклы с решениями

Задачи расположены от простых к более сложным. Сначала попробуйте решить самостоятельно, затем сверьтесь с кодом. Еще больше упражнений есть в сборнике практических задач по циклам.

Задача 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 пропускается.