您的位置:首頁>正文

Python最全協程知識點合集!神級程式師就是這麼開始的!

從語法上來看, 協程和生成器類似, 都是定義體中包含yield關鍵字的函數。 在給大家分享之前呢, 小編推薦一下一個挺不錯的交流寶地, 裡面都是一群熱愛並在學習Python的小夥伴們, 大幾千了吧, 各種各樣的人群都有, 特別喜歡看到這種大家一起交流解決難題的氛圍, 群資料也上傳了好多, 各種大牛解決小白的問題, 這個Python群:330637182 歡迎大家進來一起交流討論, 一起進步, 儘早掌握這門Python語言。

對上述例子的分析:

yield 的右邊沒有運算式, 所以這裡默認產出的值是None

剛開始先調用了next(...)是因為這個時候生成器還沒有啟動, 沒有停在yield那裡, 這個時候也是無法通過send發送資料。 所以當我們通過 next(...)啟動協程後 , 程式就會運行到x = yield, 這裡有個問題我們需要注意, x = yield這個運算式的計算過程是先計算等號右邊的內容, 然後在進行賦值, 所以當啟動生成器後, 程式會停在yield這裡, 但並沒有給x賦值。

當我們調用send方法後yield會收到這個值並賦值給x,而當程式運行到協程定義體的末尾時和用生成器的時候一樣會拋出StopIteration異常

接著再通過一個計算平均值的例子來繼續理解:

這裡是一個閉環, 只要不停send值給協程, 可以一直計算下去。

通過上面的幾個例子我們發現, 我們如果想要開始使用協程的時候必須通過next(...)方式啟動協程, 如果不預激, 這個協程就無法使用, 如果哪天在代碼中遺忘了那麼就出問題了,

所以有一種預激協程的裝飾器, 可以幫助我們幹這件事

預激協程的裝飾器

下面是預激裝飾器的演示例子:

當傳入我們定義的異常時不會影響協程,協程不會停止,可以繼續send,但是如果是沒有處理的異常的時候,就會報錯,並且協程會被終止

讓協程返回值

通過下面的例子進行演示如何獲取協程的返回值:

委派生成器在yield from 運算式處暫停時,調用方可以直接把資料發給子生成器,子生成器再把產出產出值發給調用方,子生成器返回之後,解譯器會拋出StopIteration異常,並把返回值附加到異常對象上,此時委派生成器會恢復。

下面是一個完整的例子代碼

謝謝閱讀!

當傳入我們定義的異常時不會影響協程,協程不會停止,可以繼續send,但是如果是沒有處理的異常的時候,就會報錯,並且協程會被終止

讓協程返回值

通過下面的例子進行演示如何獲取協程的返回值:

委派生成器在yield from 運算式處暫停時,調用方可以直接把資料發給子生成器,子生成器再把產出產出值發給調用方,子生成器返回之後,解譯器會拋出StopIteration異常,並把返回值附加到異常對象上,此時委派生成器會恢復。

下面是一個完整的例子代碼

謝謝閱讀!

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示