Что такое итераторpython-75

Итератор — это объект, который реализует протокол итерации, позволяющий последовательно получать элементы из коллекции или потока данных. В отличие от итерируемого объекта (Iterable), итератор сохраняет состояние итерации (текущую позицию).

Ключевые характеристики итераторов

  1. Состояние (Stateful) — запоминает текущую позицию в последовательности
  2. Ленивое вычисление (Lazy evaluation) — элементы вычисляются только при запросе
  3. Одноразовость — после полного прохода итератор "опустошается"

Протокол итератора

Итератор должен реализовать два метода:

  1. __iter__() — возвращает сам итератор (для совместимости с for-циклами)
  2. __next__() — возвращает следующий элемент или вызывает StopIteration
class 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

Как создаются итераторы?

  1. Явно — через вызов iter() на итерируемом объекте
  2. Неявно — в for-циклах, генераторах списков и т.д.
numbers = [1, 2, 3]
iterator = iter(numbers)  # Явное создание

print(next(iterator))  # 1
print(next(iterator))  # 2

Встроенные итераторы в Python

  1. Итераторы контейнеров — list_iterator, set_iterator и т.д.
  2. Файловые итераторы — построчное чтение файлов
  3. Генераторы — особый вид итераторов
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  # Не выполнится

Практическое применение итераторов

  1. Обработка больших данных — без загрузки в память
  2. Паттерны проектирования — Iterator, Observer
  3. Стриминг данных — постепенная обработка
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-циклов и генераторов, позволяя эффективно работать с потоками данных.