Python中关于生成器的问题请教

def gen():
for i in range(10):
print(‘i=’,i)
X = yield i
print(‘X=’,X)

G = gen()
print(‘next(G)=’,next(G)) #语句 1
print(‘G.send(77)=’,G.send(77)) #语句 2
print(‘G.send(88)=’,G.send(88)) #语句 3
print(‘next(G)=’,next(G)) #语句 4

输出如下:
i= 0
next(G)= 0
X= 77
i= 1
G.send(77)= 1
X= 88
i= 2
G.send(88)= 2
X= None #为何会有这个输出?
i= 3
next(G)= 3

对于上面生成器的执行,我对各语句的执行情况理解如下:
语句 1,执行到 X=yield 0 时挂起,返回 i(即 0),进入主程序体的下一条语句(即下面的语句 2 )。
语句 2,先恢复 X=yield 0 的环境,然后将上一条语句中的 X 从 0 修改为 77,并依次执行 print (‘X=’,77 )、print(‘i=’,1),直到遇到 X=yield 1 语句时再度挂起,挂起时返回 i(即 1)。
语句 3,先恢复 X=yield 1 的环境,然后将上一条语句中的 X 从 1 修改为 88,并依次执行 print (‘X=’,88 )、print(‘i=’,2),直到遇到 X=yield 2 语句时再度挂起,挂起时返回 i(即 2)。
语句 4,因为语句 3 是执行到 X=yield 2 时才挂起,挂起时 X=2。所以现在一进入语句 4,就应该执行 print(‘X=’,2),但是为何却输出 X=None ? 这点我不明白,恳请大家指点,谢谢!
Python中关于生成器的问题请教


10 回复

next(G) 等价于 G.send(None)


我无法理解你的问题

一不小心看成了“生殖器”。心里想是不是 JJ 出了什么问题。调侃一下,楼主莫怪。

#1 臣附议

谢谢,既然这样的话,我要如何才能吧下一个 i 正确赋值给 X 呢,用 next(G)已经做不到了。

哈哈,我倒希望是生殖器了,这样研究起来不会那么枯燥

我也是 !!!我怎么了

把 下一个 i 正确赋值给 X,不是很懂你的需求。。能讲得更清楚点么

没问题了,我想明白了,谢谢!

妈蛋 我也看成这个了…

回到顶部