请教一个关于生成器的问题

2017-07-30 17:36:59 +08:00
 saximi
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 ? 这点我不明白,恳请大家指点,谢谢!
1845 次点击
所在节点    Python
9 条回复
wisej
2017-07-30 20:54:26 +08:00
next(G) 等价于 G.send(None)
ErnestChan
2017-07-30 21:01:52 +08:00
一不小心看成了“生殖器”。心里想是不是 JJ 出了什么问题。调侃一下,楼主莫怪。
lxml
2017-07-30 21:21:50 +08:00
@wisej #1 臣附议
saximi
2017-07-30 23:29:58 +08:00
@wisej 谢谢,既然这样的话,我要如何才能吧下一个 i 正确赋值给 X 呢,用 next(G)已经做不到了。
saximi
2017-07-30 23:31:06 +08:00
@ErnestChan 哈哈,我倒希望是生殖器了,这样研究起来不会那么枯燥
johnny23
2017-07-30 23:35:18 +08:00
@ErnestChan 我也是 !!!我怎么了
wisej
2017-07-31 00:05:36 +08:00
@saximi 把 下一个 i 正确赋值给 X,不是很懂你的需求。。能讲得更清楚点么
saximi
2017-07-31 00:45:03 +08:00
@wisej 没问题了,我想明白了,谢谢!
rootx
2017-07-31 10:21:11 +08:00
@ErnestChan 妈蛋 我也看成这个了…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/379038

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX