Python产生了关于生成器的关键字重要性和混淆



我很困惑为什么我们不说yield b,如果我去掉yield a会有什么不同?

我只是困惑于它们与正常函数相比如何?

def fibonacci(n):
""" A generator for creating the Fibonacci numbers """
a, b, counter = 0, 1, 0
while True:
if (counter > n): 
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(5)
for x in f:
print(x, " ", end="") # 
print()

正常函数看起来几乎相同:

def fibonacci(n):
""" Afunctionfor creating the Fibonacci numbers """
a, b, counter = 0, 1, 0
numbers = []
while True:
if (counter >n): 
return numbers
numbers.append(a)
a, b = b, a + b
counter += 1

b仅用于跟踪进程的内部状态。a是唯一通过迭代器或返回值直接暴露的值,而b仅用于计算a

正则函数计算所有请求的斐波那契数,然后将它们存储在列表中,并将该列表返回给调用者。如果n很大,这可能需要大量的时间和内存。

另一方面,生成器函数几乎立即返回,因为它还没有计算出任何内容。它只返回了一个generator实例,当它被传递给next时,它将计算序列中的下一个Fibonacci数并返回它,然后返回等待,直到您再次调用next。它只使用少量恒定的内存,每次调用next只需要执行少量添加所需的时间。

最新更新