关于 y = yield x 语句流程的理解

最近学习python,在学习到廖雪峰老师讲的一个关于协程的例子中,有一种y = yield x语句,理解了很久搞明白其执行流程,现记录如下:

例子链接:

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432090171191d05dae6e129940518d1d6cf6eeaaa969000?t=1532709273575#0

n = yield r 可以假装拆分成 n = r yield n

当然实际是不能这么拆开的,这么拆开程序会报错,这么拆只是为了理解代码流程,将yield语句拆分后,那么程序可以写成如下的形式:

def consumer():
r = ''
while True:
yield r
     n = r
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'

def produce(c):
c.send(None)
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()

我们再来分析这个语句就容易很多了,

1、produce执行到send(None)语句,则consumer从头开始执行,直到执行完yield r语句停止

2、produce.send(1),则consumer从n = r开始执行,

 n = r
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'

然后继续下一次while True循环执行完yield r停止

3、produece中r = c.send(1)语句,r获得consumer所yield的数值'200 OK',分析与现象完全能对上

从分析可以看出,send(None)之后,consumer执行完yiled None就没有继续往下执行了,而下一次send(1)又会导致n = 1,因此if not n这个条件在本例子中永远不会满足,因此理论上可以删除掉 if not n: return 删除掉之后执行程序,发现结果仍然与原来一致,表明推理是正确的。

猜你喜欢

转载自www.cnblogs.com/chameleon-/p/9380405.html
今日推荐