Назад к вопросам
Вкусно и точка
Junior — Middle
56
Каким образом реализовать механизм обхода элементов коллекции с помощью итератора?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Итератор в Python реализуется через два метода: __iter__() и __next__(). Объект коллекции должен возвращать итератор, а сам итератор — по одному элементу за вызов, пока не выбросит StopIteration. Это позволяет обходить коллекцию в for, list(), sum() и других конструкциях без знания внутреннего устройства.
Определение:
Итератор — это объект, который последовательно возвращает элементы коллекции по одному.
Чтобы объект поддерживал итерацию, он должен:
- быть итерируемым: реализовывать
__iter__(); - либо сам быть итератором: реализовывать
__iter__()и__next__().
При обходе Python вызывает __next__() до тех пор, пока не получит StopIteration, что означает конец последовательности.
Пример использования:
class MyRange:
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __iter__(self):
return MyRangeIterator(self.start, self.stop)
class MyRangeIterator:
def __init__(self, current, stop):
self.current = current
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current >= self.stop:
raise StopIteration
value = self.current
self.current += 1
return value
numbers = MyRange(1, 4)
for n in numbers:
print(n)
Пояснение кода:
MyRange— это контейнер, который хранит границы диапазона.- Метод
__iter__()создаёт и возвращает отдельный объект-итераторMyRangeIterator. MyRangeIteratorхранит текущее состояние обхода вself.current.- Метод
__next__():- проверяет, не достигнут ли конец;
- если да, выбрасывает
StopIteration; - если нет, возвращает текущее значение и сдвигает указатель вперёд.
- Конструкция
forавтоматически вызываетiter(numbers)и затем многократно вызываетnext()доStopIteration.
Ключевые моменты:
- Итератор нужен для последовательного обхода элементов без доступа по индексу.
__iter__()должен возвращать итерируемый объект, чаще всего — сам итератор.__next__()возвращает следующий элемент и завершает обход черезStopIteration.for-цикл работает поверх итератора автоматически.- Если объект сам является итератором, он обычно хранит внутреннее состояние обхода.
- Для повторного обхода коллекции часто делают отдельный контейнер и отдельный итератор.