【发布时间】:2019-02-08 01:05:22
【问题描述】:
我知道 yield 会即时生成一个值,据我了解,这意味着它不会将值保存在内存中,因此当前值不应该能够交互最后的值。
但我只是想确定是这样,有人可以确认这是否可能吗?
我将使用 5 作为 number 中的值。
没有生成器的示例:
def factorial(number):
result = number
if number <= 1:
return 1
else:
for x in reversed(range(1, number)): # (4,1) reversed
result *= x # 5*4*3*2*1
return result # returns 120
是否可以通过使用 yield 函数来做同样的事情?怎么样?
谢谢
【问题讨论】:
-
但是
factorial()使用生成器有什么意义呢?你将把它当作一个函数来使用——你不会用它来迭代或生成任何东西。为什么要使用产量? -
“据我了解,这意味着它不会将值保留在内存中” - 正确。 “因此当前值不应与最后一个值交互” - 不正确。这就是变量的用途。 “没有生成器的示例:” - 不正确。
reversed和range都是生成器。如果你的意思是把factorial变成一个生成器,因为它只返回一个值,把return转换成yield就可以了。你的意思是一个生成连续阶乘的生成器,你可以像factorial(range(10))一样调用它? -
@Amadan 我希望我能给你和 Primusa 一个适当的答复,但我的知识有限,我只是在看一个关于 yield 函数的视频,这个人表明在大循环上return 函数需要更长的时间和更多的内存使用,而 yield 函数是即时的,几乎没有内存使用,在我原始帖子的示例中,如果你要对 200,000 之类的因子进行阶乘,则需要几秒钟,所以我想知道它是否可以使用yield立即获得
-
如果你要返回一个包含 200000 个元素的 list,那会占用一些内存。 生成 200000 个元素需要相同的工作量,但是如果您使用相同的算法,您可以对其进行切片。这就是为什么我说生成器通常只在您可能有多个值的情况下才有意义——总是只返回一个值的生成器不是很有用。
-
说你要200000块砖;如果您希望将它们交付,将它们放在卡车中(占用空间)并立即将它们全部交给您是有意义的。在建筑工地上,一个人把它们放在墙上,然后用砂浆拍打它们,你希望它们在你需要的时候一个接一个地交给你,而不是一下子倾倒在你身上。