Чем отличаются итератор и генератор в Python

Ответ

И итератор, и генератор в Python предоставляют способ последовательного доступа к элементам коллекции, не загружая всю коллекцию в память. Однако они создаются и работают по-разному.

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

Генератор — это более простой способ создания итератора с помощью функции и ключевого слова yield. Состояние генератора (локальные переменные) сохраняется между вызовами автоматически.

Ключевые различия:

Характеристика Итератор (класс) Генератор (функция с yield)
Создание Требует написания класса с методами __iter__ и __next__. Создается функцией с yield или генераторным выражением.
Состояние Управляется вручную через атрибуты экземпляра (например, self.index). Сохраняется автоматически между вызовами yield.
Код Более громоздкий. Компактный и более читаемый для простых случаев.

Пример:

# 1. Итератор в виде класса
class NumberIterator:
    def __init__(self, limit):
        self.limit = limit
        self.current = 0

    def __iter__(self):
        # Возвращает сам объект-итератор
        return self

    def __next__(self):
        # Возвращает следующий элемент или вызывает StopIteration
        if self.current < self.limit:
            self.current += 1
            return self.current
        else:
            raise StopIteration

# 2. Генератор в виде функции
def number_generator(limit):
    current = 0
    while current < limit:
        current += 1
        yield current # Приостанавливает выполнение и возвращает значение

# Использование
print("Итератор:", list(NumberIterator(3))) # Вывод: [1, 2, 3]
print("Генератор:", list(number_generator(3))) # Вывод: [1, 2, 3]

Вывод: Генераторы — это синтаксический сахар для создания итераторов. Их следует предпочитать для простых последовательностей из-за краткости и читаемости. Полноценные классы-итераторы нужны, когда требуется сложная логика управления состоянием или дополнительные методы.