Как с помощью `yield` можно создать генератор для получения последовательности чисел Фибоначчи?

Генератор Фибоначчи с использованием yield:

def fibonacci_generator(n):
  a, b = 0, 1
  for _ in range(n):
    yield a
    a, b = b, a + b

# Пример использования:
for num in fibonacci_generator(10):
  print(num)
  
Ключевое слово yield приостанавливает выполнение функции и возвращает значение. При следующем вызове функция возобновляет выполнение с того места, где остановилась. Это позволяет создавать последовательность чисел "лениво", по требованию, экономя память.

Для создания генератора последовательности чисел Фибоначчи с помощью yield, мы можем написать функцию, которая будет вычислять следующее число Фибоначчи и "выдавать" его, не завершая при этом свою работу. Это позволяет нам генерировать числа по требованию, экономя память.

Вот пример кода на Python:


def fibonacci_generator(n):
  """
  Генератор последовательности чисел Фибоначчи до n-го числа.
  """
  a, b = 0, 1
  for _ in range(n):
    yield a
    a, b = b, a + b

# Пример использования:
for num in fibonacci_generator(10):
  print(num) # Выводит: 0 1 1 2 3 5 8 13 21 34
  

Разберем код:

  • def fibonacci_generator(n):: Определяем функцию-генератор fibonacci_generator, которая принимает аргумент n, определяющий, сколько чисел Фибоначчи необходимо сгенерировать.
  • a, b = 0, 1: Инициализируем первые два числа Фибоначчи: a как 0 и b как 1.
  • for _ in range(n):: Запускаем цикл, который будет повторяться n раз. Использование _ в цикле означает, что мы не используем значение итератора напрямую.
  • yield a: Ключевое слово yield "выдает" текущее значение a (очередное число Фибоначчи) и приостанавливает выполнение функции. При следующем запросе на следующее значение, функция продолжит выполнение с этой точки.
  • a, b = b, a + b: Обновляем значения a и b для вычисления следующего числа Фибоначчи. a становится равным текущему b, а b становится равным сумме предыдущих a и b.

Как это работает:

Когда мы вызываем fibonacci_generator(10), создается объект-генератор. Этот объект не вычисляет сразу все числа Фибоначчи. Вместо этого, он вычисляет и "выдает" следующее число только когда мы его запрашиваем (например, в цикле for). При каждом вызове yield, функция приостанавливается и сохраняет свое состояние. Когда мы просим следующее значение, функция возобновляет выполнение с того места, где она была приостановлена, вычисляет следующее число и снова "выдает" его.

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

  • Экономия памяти: Генератор не хранит всю последовательность чисел Фибоначчи в памяти. Он генерирует числа по одному по мере необходимости. Это особенно полезно, когда мы работаем с очень большими последовательностями.
  • Ленивые вычисления: Числа Фибоначчи вычисляются только тогда, когда они нужны. Это может быть полезно, если мы не всегда используем все числа из последовательности.
0