В чем разница между генератором и итератором
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
```
**Аналогия**
Представьте, что вам нужно прочитать книгу:
**- Итерируемый объект** (как список) — это **вся книга целиком**, лежащая на столе.
**- Итератор** — это **процесс чтения**. Вы можете читать ее сами (реализовать логику в классе), листая страницы.
**- Генератор** — это **автоматическое устройство**, которое подает вам по одной странице из книги по вашей команде. Вам не нужно знать, как оно это делает, вы просто получаете страницы.