← Назад к вопросам

Как работает цикл for?

1.3 Junior🔥 61 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает цикл for в Python

Цикл for в Python — это не традиционный цикл с индексом, как в C, а итератор. Это одна из самых мощных и элегантных особенностей языка.

Базовый синтаксис

for item in iterable:
    # выполнить действие с item
    pass

Что происходит под капотом

Когда интерпретатор видит for item in iterable:, он выполняет примерно следующее:

# Шаг 1: Получить итератор из iterable
iterator = iter(iterable)

# Шаг 2: Бесконечный цикл (концептуально)
while True:
    try:
        # Шаг 3: Получить следующий элемент
        item = next(iterator)
        # Шаг 4: Выполнить тело цикла
        # выполнить действие с item
    except StopIteration:
        # Шаг 5: Итератор исчерпан, выход из цикла
        break

Это очень важно для понимания!

Итерируемые объекты (Iterable)

Итерируемый объект — это объект, который реализует метод __iter__(), возвращающий итератор.

# Примеры встроенных итерируемых объектов:
list_obj = [1, 2, 3]        # список
str_obj = "abc"             # строка
dict_obj = {"a": 1}         # словарь (итерирует ключи)
set_obj = {1, 2, 3}         # множество
range_obj = range(5)        # диапазон
tuple_obj = (1, 2, 3)       # кортеж

# Пользовательский итерируемый класс
class MyIterable:
    def __init__(self, data):
        self.data = data
    
    def __iter__(self):
        return MyIterator(self.data)

Итераторы (Iterator)

Итератор — это объект, который реализует два метода:

  • __iter__() — возвращает сам себя
  • __next__() — возвращает следующий элемент или raises StopIteration
class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

# Использование
my_iter = MyIterator([10, 20, 30])
print(next(my_iter))  # 10
print(next(my_iter))  # 20
print(next(my_iter))  # 30
print(next(my_iter))  # StopIteration ошибка

Примеры с циклом for

# Итерирование по списку
for num in [1, 2, 3]:
    print(num)  # 1, затем 2, затем 3

# Итерирование по строке (посимвольно)
for char in "abc":
    print(char)  # a, затем b, затем c

# Итерирование по диапазону
for i in range(3):
    print(i)  # 0, затем 1, затем 2

# Итерирование по словарю (ключи)
for key in {"a": 1, "b": 2}:
    print(key)  # a, затем b

# С распаковкой
for key, value in {"a": 1, "b": 2}.items():
    print(f"{key}={value}")  # a=1, затем b=2

# С индексом через enumerate
for i, item in enumerate(["x", "y", "z"]):
    print(f"{i}: {item}")  # 0: x, затем 1: y, затем 2: z

Генераторы (Generators)

Генератор — это ленивый итератор, который генерирует значения по требованию. Он использует ключевое слово yield:

def my_generator():
    yield 1
    yield 2
    yield 3

# Генератор не выполняется до первого next()
gen = my_generator()
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3

# Использование в цикле
for num in my_generator():
    print(num)  # 1, 2, 3

# Бесконечный генератор
def infinite_counter():
    n = 0
    while True:
        yield n
        n += 1

for num in infinite_counter():
    if num > 2:
        break
    print(num)  # 0, 1, 2

Выражения-генераторы (Generator Expressions)

Компактный синтаксис для создания генераторов:

# Генератор чисел в квадрате
squares = (x**2 for x in range(5))
print(next(squares))  # 0
print(next(squares))  # 1

# List comprehension (аналог)
squares_list = [x**2 for x in range(5)]  # [0, 1, 4, 9, 16]

Производительность

Генераторы очень эффективны, когда нужна ленивая обработка:

# Список — загружает всё в памяти
all_numbers = [x for x in range(1_000_000)]

# Генератор — генерирует по требованию
gen = (x for x in range(1_000_000))

# Для work_with_number в цикле, генератор используетиет значительно меньше памяти

Контроль цикла

# break — выход из цикла
for num in range(10):
    if num == 3:
        break
    print(num)  # 0, 1, 2

# continue — пропуск итерации
for num in range(5):
    if num == 2:
        continue
    print(num)  # 0, 1, 3, 4

# else — выполняется, если цикл завершился нормально (без break)
for num in range(3):
    if num == 5:
        break
else:
    print("Цикл завершился")  # выведется

for num in range(3):
    if num == 1:
        break
else:
    print("Цикл завершился")  # не выведется

Итоговая схема

for item in iterable:
    ↓
iterable.__iter__() → iterator
    ↓
iterator.__next__() → item (повторяется пока не будет StopIteration)
    ↓
выполнить тело цикла с item
    ↓
проверить break/continue
    ↓
перейти к следующей итерации
Как работает цикл for? | PrepBro