Python 当前生成器值是否可以与之前生成的值交互?
我知道,yield会动态生成一个值,根据我的理解,这意味着它不会将该值保留在内存中,因此当前值不应该能够与最后一个值交互 但我只是想确定情况确实如此,有人能证实这是否可行吗 我将使用5作为number中的值 不带发电机的示例:Python 当前生成器值是否可以与之前生成的值交互?,python,generator,yield,Python,Generator,Yield,我知道,yield会动态生成一个值,根据我的理解,这意味着它不会将该值保留在内存中,因此当前值不应该能够与最后一个值交互 但我只是想确定情况确实如此,有人能证实这是否可行吗 我将使用5作为number中的值 不带发电机的示例: def factorial(number): result = number if number <= 1: return 1 else: for x in reversed(range(1, 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
def阶乘(数字):
结果=数量
如果数字生成器可以是有状态的:
def fibs():
a, b = 1, 1
while True:
yield b
a, b = b, a + b
g = fibs()
for i in range(10):
print next(g)
这里的状态是局部变量。当生成器生成的迭代器处于活动状态时,它们保持活动状态
编辑。我瞎了这是一个阶乘
def factorials():
i = 1
a = 1
while True:
yield a
i+=1
a*=i
或者,如果你需要一个函数,而不是它们的流,那么这里有一个单行程序
print reduce(lambda a, b: a*b, (range(1, 10+1)))
生成器可以是有状态的:
def fibs():
a, b = 1, 1
while True:
yield b
a, b = b, a + b
g = fibs()
for i in range(10):
print next(g)
这里的状态是局部变量。当生成器生成的迭代器处于活动状态时,它们保持活动状态
编辑。我瞎了这是一个阶乘
def factorials():
i = 1
a = 1
while True:
yield a
i+=1
a*=i
或者,如果你需要一个函数,而不是它们的流,那么这里有一个单行程序
print reduce(lambda a, b: a*b, (range(1, 10+1)))
但是,使用生成器执行factorial()
有什么意义呢?你将把它作为一个函数来使用——你不会用它来迭代或生成任何东西。为什么使用收益率?“根据我的理解,这意味着它不会将值保留在内存中”-正确。“因此当前值不能与最后一个值交互”-不正确。这就是变量的用途。“不带生成器的示例:”-不正确。反向
和范围
都是生成器。如果您的意思是将factorial
转换为生成器,因为它只返回一个值,那么将return
转换为yield
就是所需的全部。你是说一个可以生成连续阶乘的生成器,你可以调用它,比如factorial(range(10))
?@Amadan我希望我能给你和Primusa一个正确的回答,但我的知识有限,我只是在看一个关于收益率函数的视频,此人指出,在大型循环中,返回函数将花费更长的时间和更多的内存使用,而收益函数是即时的,内存使用很少,在我的原始帖子中的示例中,如果你要对200000之类的东西进行阶乘,则需要几秒钟,所以我想知道使用yield是否可以立即返回200000个元素的列表,这需要一些内存。假设使用相同的算法,生成200000个元素所需的工作量是相同的,但是您可以对其进行切片。这就是为什么我说生成器通常只在可能有多个值的情况下才有意义——始终只返回一个值的生成器不是很有用;如果你想让他们送到,把他们放在卡车上(占用空间),然后一次把他们全部交给你是有道理的。在一个建筑工地上,当一个家伙把它们放在墙上,用灰浆打它们时,你希望它们一个接一个地交给你,而不是一下子全部扔给你。但是用发电机做factorial()
有什么意义呢?你将把它作为一个函数来使用——你不会用它来迭代或生成任何东西。为什么使用收益率?“根据我的理解,这意味着它不会将值保留在内存中”-正确。“因此当前值不能与最后一个值交互”-不正确。这就是变量的用途。“不带生成器的示例:”-不正确。反向
和范围
都是生成器。如果您的意思是将factorial
转换为生成器,因为它只返回一个值,那么将return
转换为yield
就是所需的全部。你是说一个可以生成连续阶乘的生成器,你可以调用它,比如factorial(range(10))
?@Amadan我希望我能给你和Primusa一个正确的回答,但我的知识有限,我只是在看一个关于收益率函数的视频,此人指出,在大型循环中,返回函数将花费更长的时间和更多的内存使用,而收益函数是即时的,内存使用很少,在我的原始帖子中的示例中,如果你要对200000之类的东西进行阶乘,则需要几秒钟,所以我想知道使用yield是否可以立即返回200000个元素的列表,这需要一些内存。假设使用相同的算法,生成200000个元素所需的工作量是相同的,但是您可以对其进行切片。这就是为什么我说生成器通常只在可能有多个值的情况下才有意义——始终只返回一个值的生成器不是很有用;如果你想让他们送到,把他们放在卡车上(占用空间),然后一次把他们全部交给你是有道理的。在一个建筑工地上,当一个人把它们放在墙上,用灰浆打它们时,你希望它们一个接一个地交给你,而不是一下子扔给你。注意:实际上我们不计算阶乘,我们只是把前100个存储在一个表中。它们增长得如此之快,以至于对于更大的应用来说,唯一的用例是数字理论。在这种情况下,您可以使用特定于领域的东西,比如从素因子分解计算它们。注意:实际上,我们不计算因子,我们只是将前100个存储在表中。它们增长得如此之快,以至于对于更大的应用来说,唯一的用例是数字理论。在这种情况下,您可以使用特定于领域的东西,比如从素因子分解计算它们。