Циклы в Python: for, while, range, enumerate и else — понятное руководство с примерами
Циклы — один из первых инструментов, которые осваивают в Python. Они помогают обходить коллекции, повторять действия и управлять потоком выполнения. В этом руководстве мы разберём цикл for и while, функции range и enumerate, совместную итерацию с zip, а также break, continue и малоизвестную конструкцию else у циклов.
Цикл for: итерация по коллекциям
В Python цикл for итерируется по элементам последовательности (список, строка, кортеж, словарь и т.п.), а не по индексам — это делает код чище.
fruits = ["яблоко", "банан", "киви"]
for fruit in fruits:
print(f"Мне нравится {fruit}")
Итерироваться можно и по строкам:
for ch in "Python":
print(ch, end=" ") # P y t h o n
range: последовательности чисел без лишней памяти
range создаёт «ленивую» последовательность чисел: сам по себе почти не занимает память, но выдаёт значения по мере итерации.
# range(stop)
for i in range(5):
print(i) # 0..4
# range(start, stop)
for i in range(2, 7):
print(i) # 2..6
# range(start, stop, step)
for i in range(10, 0, -2):
print(i) # 10, 8, 6, 4, 2
Частая ошибка — ожидать, что range(5) даст 1..5. На самом деле stop не включается.
enumerate: индекс и значение без range(len(...))
Вместо «антипаттерна» for i in range(len(seq)) используйте enumerate — так вы сразу получаете индекс и элемент, код читабельнее и безопаснее.
users = ["Ann", "Bo", "Cat"]
for idx, name in enumerate(users, start=1):
print(f"{idx}. {name}")
zip: параллельная итерация по нескольким последовательностям
zip объединяет последовательности по элементам. По умолчанию останавливается на самой короткой.
names = ["CPU", "RAM", "SSD"]
prices = [120, 60, 80]
for name, price in zip(names, prices):
print(f"{name}: ${price}")
Нужно строгое совпадение длины списков? В Python 3.10+ используйте zip(..., strict=True) — он бросит исключение при несовпадении:
for name, price in zip(names, prices, strict=True):
... # ValueError, если длины различаются
Если нужно «дотянуть» короткую последовательность значением по умолчанию, используйте itertools.zip_longest.
from itertools import zip_longest
for a, b in zip_longest([1, 2, 3], [10], fillvalue=0):
print(a, b) # 1 10; 2 0; 3 0
break, continue и else у циклов
- break — прерывает цикл целиком.
- continue — переходит к следующей итерации.
- else у цикла — выполняется, если цикл завершился без break.
# Поиск простого числа: если делитель не найден, сработает else
n = 29
for d in range(2, int(n ** 0.5) + 1):
if n % d == 0:
print(f"{n} составное")
break
else:
print(f"{n} простое")
Ещё пример с continue: пропустим отрицательные числа и посчитаем сумму положительных.
nums = [2, -1, 7, -3, 4]
s = 0
for x in nums:
if x < 0:
continue
s += x
print(s) # 13
Цикл while: когда условие важнее последовательности
Используйте while, если нужно повторять действие до выполнения условия.
# Считывание hasta-сигнала (пока пользователь не введёт пустую строку)
lines = []
while True:
line = input()
if not line:
break
lines.append(line)
print("\n".join(lines))
У while тоже есть else — он выполнится, если цикл завершён без break.
attempts = 3
password = "s3cr3t"
while attempts:
guess = input("Пароль: ")
if guess == password:
print("Вход выполнен")
break
attempts -= 1
else:
print("Попытки исчерпаны")
Итерация по словарям: items, keys, values
Итерируйте словари правильно: используйте .items() для пары ключ-значение.
user = {"name": "Ann", "age": 30}
for key, value in user.items():
print(key, value)
Если нужны только ключи или значения:
for k in user.keys():
print(k)
for v in user.values():
print(v)
Частые ошибки и лучшие практики
- Не модифицируйте список, по которому итерируетесь. Либо итерируйтесь по копии, либо создавайте новый список.
nums = [1, 2, 3, 4]
# Плохо: удаление во время итерации ломает индексы
# for x in nums:
# if x % 2 == 0:
# nums.remove(x)
# Хорошо: создаём новый список
filtered = []
for x in nums:
if x % 2 != 0:
filtered.append(x)
print(filtered) # [1, 3]
- Не злоупотребляйте range(len(...)). Предпочитайте
enumerateи прямую итерацию. - Следите за условиями в while. Избегайте бесконечных циклов по ошибке. Если нужен «намеренный» бесконечный — используйте
while Trueс понятнымbreak. - Выносите тяжёлые вычисления из тела цикла. Например, заранее вычислите длину или подготовьте структуры данных.
Паттерны, ускоряющие работу
Итерация парой индекс-элемент:
for i, x in enumerate(data):
...
Итерация по двум спискам с валидацией длины (Python 3.10+):
for a, b in zip(a_list, b_list, strict=True):
...
Замена вложенных циклов на product:
from itertools import product
for x, y in product(range(3), range(2)):
print(x, y)
Мини‑практика
- Подсчёт частоты слов: пройтись по словам строки и собрать словарь частот.
- Слияние списков с проверкой длины: склеить два списка в пары, упасть с ошибкой при разной длине (используйте
zip(..., strict=True)). - Поиск первого элемента по условию: найти первое число > 100 в списке; если не найдено — вывести сообщение (подсказка:
for...else).
Итоги
Вы узнали, как правильно выбирать между for и while, использовать range, enumerate и zip, а также управлять циклом с помощью break/continue и else. Эти техники покрывают 80% сценариев в повседневном Python-коде.
Хотите закрепить всё на практике и пройти полный путь от основ до продвинутых тем с задачами и проверкой? Загляните в курс «Прокачай Python от нуля до гуру на реальных проектах» — там вы отточите навыки циклов и не только.
-
Создано 07.01.2026 17:02:56
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.