Итератор — это объект, который реализует протокол итерации, позволяющий последовательно получать элементы из коллекции или потока данных. В отличие от итерируемого объекта (Iterable), итератор сохраняет состояние итерации (текущую позицию).
Итератор должен реализовать два метода:
__iter__()
— возвращает сам итератор (для совместимости с for-циклами)__next__()
— возвращает следующий элемент или вызывает StopIterationclass SimpleIterator:
def __init__(self, limit):
self.limit = limit
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current < self.limit:
self.current += 1
return self.current
raise StopIteration
numbers = [1, 2, 3]
iterator = iter(numbers) # Явное создание
print(next(iterator)) # 1
print(next(iterator)) # 2
list_iter = iter([1, 2, 3])
dict_iter = iter({'a': 1, 'b': 2}.items())
Характеристика | Итерируемый объект (Iterable) | Итератор (Iterator) |
---|---|---|
Сохраняет состояние | Нет | Да |
Можно повторно итерировать | Да | Нет |
Основной метод | __iter__() | __next__() |
numbers = [1, 2, 3] # Iterable
iterator = iter(numbers) # Iterator
# Iterable можно использовать много раз
for x in numbers: pass
for x in numbers: pass
# Iterator одноразовый
for x in iterator: pass
for x in iterator: pass # Не выполнится
def read_large_file(filename):
"""Ленивое чтение большого файла"""
with open(filename) as f:
for line in f:
yield line.strip()
# Использование:
for line in read_large_file('huge.log'):
process(line) # Обрабатываем по одной строке
from collections.abc import Iterator
data = [1, 2, 3]
print(isinstance(iter(data), Iterator)) # True
print(isinstance(data, Iterator)) # False
Итератор — это объект с состоянием, реализующий методы __iter__()
и __next__()
, который предоставляет последовательный доступ к элементам. Ключевые особенности: одноразовость, ленивые вычисления и сохранение состояния. Итераторы лежат в основе работы for-циклов и генераторов, позволяя эффективно работать с потоками данных.