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

Как работает оператор for в Python?

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

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

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

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

Как работает оператор for в Python

Оператор for в Python — это один из самых мощных инструментов языка. Под капотом он работает с итераторами и генераторами, что делает его гибким и универсальным.

Основной механизм

Цикл for под капотом

Этот код:

for item in sequence:
    print(item)

Эквивалентен:

iterator = iter(sequence)  # Получаем итератор
while True:
    try:
        item = next(iterator)  # Получаем следующий элемент
        print(item)
    except StopIteration:
        break  # Конец итерации

Два важных протокола

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

Объект с методом __iter__(), который возвращает итератор:

class CountUp:
    def __init__(self, max):
        self.max = max
    
    def __iter__(self):
        # Возвращает новый итератор
        return CountUpIterator(self.max)

class CountUpIterator:
    def __init__(self, max):
        self.current = 1
        self.max = max
    
    def __iter__(self):
        return self  # Итератор сам себя итерирует
    
    def __next__(self):
        if self.current <= self.max:
            result = self.current
            self.current += 1
            return result
        else:
            raise StopIteration

counter = CountUp(3)
for num in counter:
    print(num)  # 1, 2, 3

2. Итератор (Iterator)

Объект с методами __iter__() и __next__():

class SimpleIterator:
    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
        result = self.data[self.index]
        self.index += 1
        return result

it = SimpleIterator([1, 2, 3])
for value in it:
    print(value)  # 1, 2, 3

Встроенные итерируемые объекты

Список

for item in [1, 2, 3]:
    print(item)

# Python вызывает iter() на списке
it = iter([1, 2, 3])
print(next(it))  # 1
print(next(it))  # 2

Строка

for char in "hello":
    print(char)  # h, e, l, l, o

# Строка итерируется по символам
it = iter("hi")
print(next(it))  # 'h'
print(next(it))  # 'i'

Словарь

data = {"a": 1, "b": 2, "c": 3}

# По умолчанию итерирует по ключам
for key in data:
    print(key)  # a, b, c

# По ключам явно
for key in data.keys():
    print(key)

# По значениям
for value in data.values():
    print(value)  # 1, 2, 3

# По парам
for key, value in data.items():
    print(f"{key}: {value}")

Диапазон

for i in range(5):
    print(i)  # 0, 1, 2, 3, 4

# range — это объект-итератор
for i in range(2, 8, 2):
    print(i)  # 2, 4, 6

Генераторы

Мощный способ создания итераторов с помощью yield:

def count_up(max):
    current = 1
    while current <= max:
        yield current  # Возвращает значение и приостанавливает функцию
        current += 1

for num in count_up(5):
    print(num)  # 1, 2, 3, 4, 5

# Генератор экономит память — вычисляет значения по требованию
def infinite_counter():
    count = 0
    while True:
        yield count
        count += 1

for num in infinite_counter():
    if num > 5:
        break
    print(num)

Распаковка в цикле

pairs = [(1, 'a'), (2, 'b'), (3, 'c')]

# Распаковка кортежей
for num, letter in pairs:
    print(f"{num}: {letter}")

# Распаковка списков
for a, b, c in [[1, 2, 3], [4, 5, 6]]:
    print(a + b + c)

# С пропусками переменных
for i, _ in enumerate([10, 20, 30]):
    print(i)  # 0, 1, 2

Функции, работающие с итерациями

enumerate()

colors = ['red', 'green', 'blue']
for index, color in enumerate(colors):
    print(f"{index}: {color}")
    # 0: red
    # 1: green
    # 2: blue

# Начать нумерацию с 1
for index, color in enumerate(colors, start=1):
    print(f"{index}: {color}")

zip()

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]

for name, age in zip(names, ages):
    print(f"{name} is {age}")
    # Alice is 25
    # Bob is 30
    # Charlie is 35

map()

numbers = [1, 2, 3, 4]

for squared in map(lambda x: x**2, numbers):
    print(squared)  # 1, 4, 9, 16

filter()

numbers = [1, 2, 3, 4, 5, 6]

for even in filter(lambda x: x % 2 == 0, numbers):
    print(even)  # 2, 4, 6

Break и Continue

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

# continue: перейти к следующей итерации
for i in range(5):
    if i == 2:
        continue  # Пропустить
    print(i)  # 0, 1, 3, 4

# else: выполнится если цикл НЕ был прерван break
for i in range(3):
    print(i)
else:
    print("Цикл завершён нормально")  # Выполнится

for i in range(10):
    if i == 5:
        break
else:
    print("Не выполнится")  # break прерывает else

Практические примеры

# Итерация по файлам
with open('data.txt') as f:
    for line in f:
        print(line.strip())

# Вложенные циклы
matrix = [[1, 2], [3, 4]]
for row in matrix:
    for value in row:
        print(value)

# List comprehension (краткий синтаксис)
squares = [x**2 for x in range(5)]  # [0, 1, 4, 9, 16]

# Generator expression (экономит память)
large_squares = (x**2 for x in range(1000000))
for square in large_squares:
    print(square)

Резюме

  • for работает с итерируемыми объектами через протоколы __iter__() и __next__()
  • Итератор — объект с методами __iter__() и __next__()
  • Генераторы — удобный способ создания итераторов через yield
  • StopIteration — сигнал конца итерации
  • Используйте enumerate(), zip(), map(), filter() для элегантного кода