Python产生了关键字的重要性和关于生成器的混淆?
我很困惑为什么我们不说Python产生了关键字的重要性和关于生成器的混淆?,python,python-3.x,iterator,generator,Python,Python 3.x,Iterator,Generator,我很困惑为什么我们不说收益率b,如果我去掉收益率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
,区别会是什么
我只是对它们与正常函数的比较感到困惑
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):
""" A function for 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
def fibonacci(n):
“”“用于创建斐波那契数的函数”“”
a、 b,计数器=0,1,0
数字=[]
尽管如此:
如果(计数器>n):
返回号码
数字。附加(a)
a、 b=b,a+b
计数器+=1
b
仅用于跟踪流程的内部状态a
是唯一通过迭代器或返回值直接公开的值,b
仅用于计算a
正则函数计算所有请求的斐波那契数,然后将它们存储在一个列表中,并将该列表返回给调用者。如果n
很大,这可能需要大量的时间和内存
另一方面,生成器函数几乎立即返回,因为它还没有计算任何内容。它只返回了一个
生成器
实例,当传递到下一个
时,该实例将计算序列中的下一个斐波那契数并返回它,然后返回等待,直到再次调用下一个
。它只使用少量的固定内存,每次调用next
只需要执行少量加法所需的时间。看起来a
包含序列中的“当前”数字,b
包含“下一个”数字。你可以说yield b
;这是函数最终想要产生的值。但是,如果您这样做,您将不得不在下一次迭代中跳过生成a
,因为这与当前迭代中的b
值相同。那么,如果生成器相同,我们为什么还要使用它们呢?这就是我困惑的地方!它们不一样,但定义看起来很相似。函数在返回之前创建所有请求的斐波那契数的列表。生成器函数创建一个生成器,它只计算在迭代时实际请求的每个数。因此,它们是C++中的空余函数,但具有保存结果的能力,好像它们是通过引用权传递的。不完全是这样,假设“空虚函数”是指不返回值的函数。code>fibonacci仍然返回一个值,但该值与协同程序非常相似,它类似于一个函数,但更一般,因为您可以暂停它的执行并在以后恢复它,而不必退出并重新启动。