在 Python 產生器領域,yield 關鍵字是基石,允許建立可迭代序列。然而,除了yield之外,另一個神秘的函數也潛伏在陰影中:send。
文件提供了一個神秘的描述,指出send「恢復執行並將一個值「發送」到生成器函數中。」這引發了關於其目的及其與收益率的關係的問題。
值是輸入和輸出?
第一個困惑來自於值作為輸入的概念到生成器函數。但是,文件也建議 send 傳回生成器產生的下一個值。這不正是yield執行的功能嗎?
揭示真正的目的
解決這個謎題的關鍵在於理解send可以注入值,而發電機正在屈服。考慮以下範例:
<code class="python">def double_inputs(): while True: x = yield yield x * 2</code>
將此產生器想像為一個有兩個孔的黑盒子:一個用於接收值(yield),一個用於傳回值(yield)。如果您要呼叫 next(generator) 來啟動生成器,它將在第一個yield 語句處暫停,等待輸入。
現在,您可以使用 send 將值輸入產生器。該值暫時儲存在 x 變數中。恢復生成器後,第一個yield語句之外的程式碼將執行,有效地將輸入值加倍並透過yield返回它。
一個非Yieldworthy範例
來示範要了解send 的獨特功能無法透過yield 實現,請考慮以下內容:
<code class="python">gen = double_inputs() next(gen) # run up to the first yield gen.send(10) # goes into 'x' variable</code>
此程式碼有效地將值10 注入生成器。然後它恢復執行並返回 20,即雙倍的值。這一系列操作不可能只透過yield來實現。
Twisted 的 send 魔法
send 的一個實際應用是 Twisted 的 @defer.inlineCallbacks 裝飾器。它允許您編寫生成延遲物件(代表未來值)的函數。底層框架攔截這些Deferred對象,在後台執行必要的計算。
計算完成後,框架將結果傳回產生器,模擬復原執行並讓產生器繼續進行後續操作操作。
結論
Python 生成器上的傳送函數可讓您將值注入到在yield 語句處暫停的生成器中。此功能可實現複雜的控制流程並簡化非同步編程,如 Twisted 的 @defer.inlineCallbacks 裝飾器所示。透過了解 send 和 Yield 的獨特用途,您可以在 Python 程式碼中釋放生成器的全部潛力。
以上是Python 生成器中「send」函數的真正用途是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!