3. Что такое генератор?
Генератор - тип итератора, который генерирует последовательность по одному с помощью ключевого слова yield
Обычно генератор создаётся:
- с помощью функции с yield
- или генераторного выражения
Он:
- работает лениво (lazy evaluation)
- сохраняет своё состояние между вызовами
- позволяет эффективно работать с большими данными
Простое объяснение
Генератор - это как автомат, который выдаёт значения по одному.
Ты не получаешь сразу весь список.
Ты запрашиваешь:
- первый элемент → получаешь
- второй → получаешь
- и так далее
Он запоминает, где остановился, и продолжает с этого места.
Чем генератор отличается от итератора
Итератор - это общий механизм, который возвращает элементы по одному.
Генератор - это удобный способ создать итератор с помощью yield.
Коротко:
итератор — общее понятие
генератор — частный случай итератора
Более глубокое объяснение и пример
Генератор создаётся через yield.
def my_generator():
yield 1
yield 2
yield 3
Когда вызываешь функцию:
gen = my_geterator()
Она не выполняется полностью и не возвращает список.
Она возвращает генераторный объект.
Далее:
print(next(gen)) #1
print(next(gen)) #2
print(next(gen)) #3
Когда и зачем используется
Генераторы используют, когда:
- данных много (файлы, базы, логи)
- не нужно хранить всё в памяти
- нужна потоковая обработка
def read_lines(filename):
with open(filename) as f:
for line in f:
yield line.strip()
Здесь файл читается построчно, а не целиком.
Генератор - это частный случай итератора, который позволяет получать значения по одному с помощью yield, не создавая их все сразу.