Python:一个函数中有两个 "yield"
Python: two "yield"s in one function
我们在 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.send(66)
a2 = gen.send(77)
print a1
print a2
结果很惊人:
>>> 7766
21
5
i=5, j=21 => yield i => a1=21 => send(66) => x = 66
i=5, j=21 => yield j => a2=5 => send(77) => y = 7700
打印 7766
打印 21
打印 5
即yield i
后,a1
得到j
的值; yield j
后,a2
得到i
.
的值
有谁知道为什么 yield
这样做?为什么不是 a1=5,a2=21?
next(gen)
从第一个 yield i
调用方法 returns。您的 a1 = gen.send(66)
然后在 y = (yield j) * 100
恢复方法并从那里产生 j
。 a2 = gen.send(77)
行之后直接恢复该方法,returns 从 x = yield i
.
next(gen)
从生成器中取出第一个元素 (i
):
next(gen) # 5
则gen.send(66)
等于j
(即21)。由于您的第二个循环仍在工作,因此后续 gen.send(77)
等于 i
(仍然是 5)。
本质上,问题是您消耗了 3 个值,而不是 2.
使用gen.send(None)
或next(gen)
启动生成器:
a1 = gen.send(None) # or a1 = next(gen)
a2 = gen.send(77)
print(a1, a2) # prints 5 21
我们在 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.send(66)
a2 = gen.send(77)
print a1
print a2
结果很惊人:
>>> 7766
21
5
i=5, j=21 => yield i => a1=21 => send(66) => x = 66
i=5, j=21 => yield j => a2=5 => send(77) => y = 7700
打印 7766
打印 21
打印 5
即yield i
后,a1
得到j
的值; yield j
后,a2
得到i
.
有谁知道为什么 yield
这样做?为什么不是 a1=5,a2=21?
next(gen)
从第一个 yield i
调用方法 returns。您的 a1 = gen.send(66)
然后在 y = (yield j) * 100
恢复方法并从那里产生 j
。 a2 = gen.send(77)
行之后直接恢复该方法,returns 从 x = yield i
.
next(gen)
从生成器中取出第一个元素 (i
):
next(gen) # 5
则gen.send(66)
等于j
(即21)。由于您的第二个循环仍在工作,因此后续 gen.send(77)
等于 i
(仍然是 5)。
本质上,问题是您消耗了 3 个值,而不是 2.
使用gen.send(None)
或next(gen)
启动生成器:
a1 = gen.send(None) # or a1 = next(gen)
a2 = gen.send(77)
print(a1, a2) # prints 5 21