Нормальная функция будет выглядеть почти так же:
def fibonacci(n):
""" A <b>function</b> for creating the Fibonacci numbers """
a, b, counter = 0, 1, 0
<b>numbers = []</b>
while True:
if (counter > n):
<b>return numbers</b>
<b>numbers.append(a)</b>
a, b = b, a + b
counter += 1
b
используется только для отслеживания внутреннего состояния процесса. a
- единственное значение, когда-либо напрямую отображаемое через итератор или возвращаемое значение, а b
используется только для вычисления a
.
Обычная функция вычисляет все запрошенное Числа Фибоначчи, затем сохраняют их в списке и возвращают этот список вызывающей стороне. Это может потребовать значительного времени и памяти, если n
велико.
Функция генератора, с другой стороны, возвращает почти сразу, потому что она еще ничего не вычисляла. Он только возвратил экземпляр generator
, который при передаче на next
вычислит следующее число Фибоначчи в последовательности и вернет его, затем go вернется в ожидание, пока вы снова не вызовете next
. Он всегда использует только небольшой постоянный объем памяти, и каждый вызов next
занимает только столько времени, сколько необходимо для выполнения небольшого количества добавлений.