最近學習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 刪除掉之后執行程序,發現結果仍然與原來一致,表明推理是正確的。