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

Что такое итерационный протокол?

1.3 Junior🔥 41 комментариев
#Другое

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

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

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

Что такое итерационный протокол

Итерационный протокол — это соглашение в Python, которое позволяет объекту быть использованным в цикле for. Объект должен реализовать два метода: __iter__() и __next__().

Основные компоненты

Итерируемый объект (Iterable) — реализует __iter__():

class MyIterable:
    def __init__(self, data):
        self.data = data
    
    def __iter__(self):
        return iter(self.data)  # Возвращает итератор

Итератор (Iterator) — реализует __iter__() и __next__():

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

Как это работает

# Когда ты пишешь:
for item in my_list:
    print(item)

# Python делает:
iterator = my_list.__iter__()  # Создаёт итератор
while True:
    try:
        item = iterator.__next__()  # Получает следующий элемент
        print(item)
    except StopIteration:  # Когда элементы закончились
        break

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

Создание кастомного итератора:

class CountUp:
    def __init__(self, max):
        self.max = max
        self.current = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        self.current += 1
        if self.current > self.max:
            raise StopIteration
        return self.current

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

Итератор по диапазону:

class Range:
    def __init__(self, start, end):
        self.current = start
        self.end = end
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current >= self.end:
            raise StopIteration
        value = self.current
        self.current += 1
        return value

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

Генераторы — упрощённый способ

Генератор — это функция с yield, которая автоматически реализует итерационный протокол:

def my_range(start, end):
    current = start
    while current < end:
        yield current
        current += 1

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

# Эквивалентно классу выше, но проще и понятнее

Best Practices

  1. Используй встроенные типы — они уже итерируемые
  2. Используй генераторы вместо классов — проще
  3. Различай Iterable и Iterator — первый требует __iter__(), второй __iter__() и __next__()

Итерационный протокол — фундамент for циклов в Python.