Реализация пользовательского итератора в Python

Храните последовательность и текущий индекс. __iter__ возвращает self, а __next__ увеличивает индекс или поднимает StopIteration.

Короткий ответ

Что ответить на собеседовании

Храните последовательность и текущий индекс. 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 сразу завершает итерацию. Исчерпанный итератор не начинает обход заново: для повторного прохода нужно создать новый экземпляр.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее