Python генераторы

Опубликовано 2021.08.25

Генератор - это обыкновенная функция python. Главное отличие - это то, что данные она возвращает не командой return, а командой yield.

Эта команда и будет генерировать последовательность значений.

И если вызвать такую функцию - она не вернёт объект генератора, не значение. Затем из данного объекта посредством функции next или цикла for удастся получить значения, которые должна была вернуть функция.

Когда генератор вернёт все данные - будет брошен эксепшн типа StopIteration. По сути - генератор это тот же итератор, просто выглядит по-другому.

Ещё важный момент - генератор вернёт данные лишь однажды. И перебрать его результаты можно лишь единожды. Это происходит из-за того, что данные не хранятся в памяти, а генерируются на лету.

Пример:

  1. def animals_generator():
  2. yield 'овца'
  3. for animal in ['енот', 'лошадь', 'олень']:
  4. yield animal
  5. yield 'собака'
  6.  
  7. animals = animals_generator()
  8.  
  9. # # Выведет:
  10. # 1: овца
  11. # 1: енот
  12. # 1: лошадь
  13. # 1: олень
  14. # 1: собака
  15. for animal in animals:
  16. print(f'1: {animal}')
  17.  
  18. # Ничего не выведет
  19. for animal in animals:
  20. print(f'2: {animal}')