当前的生成器值可以与之前生成的值交互吗?
Can a current generator value interact with the value generated before it?
我知道 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 函数做同样的事情?怎么样?
谢谢
生成器可以是有状态的:
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)))
我知道 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 函数做同样的事情?怎么样?
谢谢
生成器可以是有状态的:
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)))