Как создать генератор с помощью `yield`?

Генератор с `yield` создается путем определения функции, которая вместо `return` использует ключевое слово `yield`. При каждом вызове `yield` функция приостанавливает свое выполнение и возвращает указанное значение. При следующем запросе к генератору, выполнение продолжается с места остановки.

Пример:

  def my_generator(n):
    for i in range(n):
      yield i

  gen = my_generator(3)
  print(next(gen)) # 0
  print(next(gen)) # 1
  print(next(gen)) # 2
  

Создать генератор в Python с помощью yield очень просто. Вместо того чтобы возвращать все значения сразу (как функция с return), генератор "выдает" значения по одному по требованию, приостанавливая свое выполнение между выдачами. Это делает генераторы очень эффективными для работы с большими объемами данных, которые не обязательно хранить в памяти целиком.

Основной принцип: функция, содержащая оператор yield, автоматически становится генератором.

Пример:


def my_generator(n):
  """Генератор, выдающий числа от 0 до n-1"""
  for i in range(n):
    yield i

# Использование генератора:
gen = my_generator(5)  # Создаем объект генератора

# Получаем значения по одному:
print(next(gen)) # Выведет: 0
print(next(gen)) # Выведет: 1
print(next(gen)) # Выведет: 2
print(next(gen)) # Выведет: 3
print(next(gen)) # Выведет: 4

# После исчерпания значений генератора, next(gen) вызовет StopIteration
# Можно использовать в цикле:
for value in my_generator(3):
    print(value) # Выведет 0, 1, 2

  

Ключевые моменты:

  • yield "замораживает" состояние функции-генератора. При следующем вызове next() выполнение продолжится с места, где был оператор yield.
  • Когда функция-генератор доходит до конца или выполняет return, она вызывает исключение StopIteration, сигнализируя об окончании генерации значений.
  • Можно использовать генераторы в циклах for. Цикл for автоматически обрабатывает исключение StopIteration.
  • Генераторы - это итераторы, но не наоборот. Итератор должен реализовывать методы __iter__() и __next__(), в то время как генератор создается автоматически с помощью yield.

Преимущества использования генераторов:

  • Экономия памяти: Генераторы генерируют значения по требованию, а не хранят все значения в памяти сразу.
  • Ленивая загрузка: Значения вычисляются только тогда, когда они необходимы.
  • Более читаемый код: Генераторы позволяют элегантно представлять последовательности данных.
0