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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM