В чем разница между генератором и итератором

Python Senior Без компании
В чем разница между генератором и итератором
Ответы
**Каждый генератор является итератором, но не каждый итератор является генератором**. **Итератор** - Это объект, который реализует **протокол итератора**: методы `__iter__()` и `__next__()`. - Его главная задача — **предоставлять следующий элемент** по запросу и сигнализировать о конце последовательности. *Пример:* ``` class Counter: def __init__(self, low, high): self.current = low self.high = high def __iter__(self): return self def __next__(self): if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1 # Использование c = Counter(3, 5) print(next(c)) # 3 print(next(c)) # 4 ``` **Генератор** - Это **особый вид итератора**, но гораздо более простой в написании. - Он не требует создания класса с методами `__iter__` и `__next__`. Вместо этого используется **функция с ключевым словом** `yield`. - Генератор **"ленивый"** — он генерирует значения по одному и по требованию, а не хранит всю последовательность в памяти. *Пример. Функция-генератор (с помощью* `yield`*):* ``` def counter_generator(low, high): current = low while current <= high: yield current # Возвращает значение и "замораживает" состояние функции current += 1 # Использование gen = counter_generator(3, 5) # Создает объект-генератор print(next(gen)) # 3 (значение первого yield) print(next(gen)) # 4 (значение второго yield) ``` *Пример. Генераторное выражение* ``` # Генераторное выражение numbers = (x * 2 for x in range(5)) print(next(numbers)) # 0 print(next(numbers)) # 2 ``` **Аналогия** Представьте, что вам нужно прочитать книгу: **- Итерируемый объект** (как список) — это **вся книга целиком**, лежащая на столе. **- Итератор** — это **процесс чтения**. Вы можете читать ее сами (реализовать логику в классе), листая страницы. **- Генератор** — это **автоматическое устройство**, которое подает вам по одной странице из книги по вашей команде. Вам не нужно знать, как оно это делает, вы просто получаете страницы.