Вопрос36
Осталось:

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

Образцовый ответ

Показывать ответ по умолчанию

Итератор — это объект, который возвращает элементы по одному через метод __next__() и сигнализирует об окончании через исключение StopIteration.

Протокол итерации:

  • __iter__() — возвращает сам итератор.
  • __next__() — возвращает следующий элемент или выбрасывает StopIteration.

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

# Что делает for под капотом
nums = [1, 2, 3]

# for num in nums:
#     print(num)

# Эквивалент:
iterator = iter(nums)       # Вызывает nums.__iter__()
while True:
    try:
        num = next(iterator)  # Вызывает iterator.__next__()
        print(num)
    except StopIteration:
        break

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

class Countdown:
    def __init__(self, start):
        self.current = start

    def __iter__(self):
        return self

    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        value = self.current
        self.current -= 1
        return value

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

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

  • list, tuple, str, dict, setитерируемые (имеют __iter__).
  • range(), map(), filter(), zip() — возвращают итераторы.
  • Итератор можно пройти только один раз, а итерируемый объект можно проходить многократно.

На практике:

Протокол итерации лежит в основе циклов for, генераторов и многих встроенных функций. Собственные итераторы полезны, когда нужно обрабатывать данные порциями — например, читать большой файл построчно вместо загрузки целиком.