Храните последовательность и текущий индекс. iter возвращает self, а next увеличивает индекс или поднимает StopIteration.
Реализация пользовательского итератора в Python
Храните последовательность и текущий индекс. __iter__ возвращает self, а __next__ увеличивает индекс или поднимает StopIteration.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать собственный класс‑итератор, который будет последовательно возвращать элементы переданного списка.
class MyIterator:
def __init__(self, data):
# TODO
def __iter__(self):
# TODO
def __next__(self):
# TODO
Класс должен поддерживать протокол итераций: метод __iter__ возвращает объект‑итератор, а __next__ выдаёт следующий элемент списка, бросая StopIteration по его окончании.
Ответ
Храните последовательность и текущий индекс. iter возвращает self, а next увеличивает индекс или поднимает StopIteration.
class MyIterator:
def __init__(self, data):
self.data = tuple(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
Копия в tuple защищает последовательность от внешнего добавления и удаления элементов, но требует O(n) памяти. Для пустого списка первый вызов next сразу завершает итерацию. Исчерпанный итератор не начинает обход заново: для повторного прохода нужно создать новый экземпляр.