Python:two";“收益率”;s在一个函数中
我们在Python的Python:two";“收益率”;s在一个函数中,python,yield,coroutine,Python,Yield,Coroutine,我们在Python的yield上发现了一个有趣的问题。我们编写了一个简单的程序: def F(): for i in range(5, 9): for j in range(21, 29): x = yield i y = (yield j) * 100 x += y print '>>>', x gen = F() next(gen) a1 = gen.s
yield
上发现了一个有趣的问题。我们编写了一个简单的程序:
def F():
for i in range(5, 9):
for j in range(21, 29):
x = yield i
y = (yield j) * 100
x += y
print '>>>', x
gen = F()
next(gen)
a1 = gen.send(66)
a2 = gen.send(77)
print a1
print a2
结果是惊人的:
>>> 7766
21
5
i=5,j=21=>收益率i=>a1=21=>send(66)=>x=66
i=5,j=21=>收益率j=>a2=5=>send(77)=>y=7700
打印7766
打印21
打印5
i、 e.在收益率i
之后,a1
获得j
的值;在yield j
之后,a2
获取i
的值
有人知道你为什么这样做吗?为什么a1=5,a2=21?下一个(gen)
调用从第一个产生i
返回的方法。您的a1=gen.send(66)
然后在y=(收益率j)*100处恢复该方法,并从此处产生j
。a2=gen.send(77)
行随后直接恢复该方法,并从x=yield i
next(gen)
调用该方法,该方法从第一个yield i
返回。您的a1=gen.send(66)
然后在y=(收益率j)*100处恢复该方法,并从此处产生j
。a2=gen.send(77)
行随后直接恢复该方法,并从x=yield i
返回next(gen)
从生成器中获取第一个元素(i
):
那么gen.send(66)
等于j
(即21)。由于第二个循环仍在工作,因此后续的gen.send(77)
等于i
(仍然是5)
从本质上讲,问题是您使用3个值,而不是2个值
使用或next(gen)
启动发电机:
a1 = gen.send(None) # or a1 = next(gen)
a2 = gen.send(77)
print(a1, a2) # prints 5 21
next(gen)
从生成器中获取第一个元素(i
):
那么gen.send(66)
等于j
(即21)。由于第二个循环仍在工作,因此后续的gen.send(77)
等于i
(仍然是5)
从本质上讲,问题是您使用3个值,而不是2个值
使用或next(gen)
启动发电机:
a1 = gen.send(None) # or a1 = next(gen)
a2 = gen.send(77)
print(a1, a2) # prints 5 21
@AshwiniChaudhary很抱歉没有执行next()函数。@AshwiniChaudhary很抱歉没有执行next()函数。