Ответ
Для создания пользовательского итератора в Python необходимо реализовать протокол итератора, который состоит из двух dunder-методов:
-
__iter__()- Вызывается один раз при инициализации цикла (например,
for). - Должен возвращать сам объект итератора. Чаще всего это просто
return self.
- Вызывается один раз при инициализации цикла (например,
-
__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