Какие методы необходимо реализовать в Python для создания пользовательского итератора?

Ответ

Для создания пользовательского итератора в Python необходимо реализовать протокол итератора, который состоит из двух dunder-методов:

  1. __iter__()

    • Вызывается один раз при инициализации цикла (например, for).
    • Должен возвращать сам объект итератора. Чаще всего это просто return self.
  2. __next__()

    • Вызывается на каждой итерации цикла для получения следующего элемента.
    • Должен возвращать следующий элемент последовательности.
    • Когда элементы заканчиваются, метод должен вызывать исключение StopIteration, чтобы сигнализировать о завершении итерации.

Пример класса-итератора:

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

    def __iter__(self):
        return self

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

# Использование:
for i in CountDown(3):
    print(i) # Выведет 3, 2, 1

Альтернатива: Генераторы

Более простой и идиоматичный способ создать итератор — использовать функцию-генератор с ключевым словом yield. Python автоматически создаст объект, реализующий протокол итератора.

def countdown_generator(start):
    current = start
    while current > 0:
        yield current
        current -= 1

# Использование такое же:
for i in countdown_generator(3):
    print(i) # Выведет 3, 2, 1