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