深入研究Python 中產生器「傳送」函數的用途
產生器是Python 用於建立自訂迭代器的強大工具,不僅提供除了yield關鍵字之外,還有一個鮮為人知但同樣重要的函數:send。與從生成器提供輸出的yield 不同,send 允許您在生成器執行期間與生成器進行交互,引入輸入來指導其行為。
文件將 send 描述為將值傳送到生成器函數中,使其成為生成器函數。 yield 表達式的目前結果。這與yield的主要目的略有不同,yield會傳回下一個產生的值。那麼,這種差異究竟意味著什麼?
範例:揭示發送的力量
考慮以下生成器:
<code class="python">def double_inputs(): while True: x = yield yield x * 2</code>
這個生成器產生透過send 發送給它的值的兩倍。在生成器的執行中使用send,我們可以觀察它的行為:
<code class="python">>>> gen = double_inputs() >>> next(gen) # Execute until the first yield >>> gen.send(10) # Send value into the generator 20 >>> next(gen) # Execute until the next yield >>> gen.send(6) 12 >>> next(gen) # Execute until the next yield >>> gen.send(94.3) 188.5999999999999</code>
如果沒有send函數,單獨使用yield是不可能實現這個功能的。
實際應用: Twisted 中的 @defer.inlineCallbacks
發送最引人注目的用例之一在於與 Twisted 的 @defer.inlineCallbacks 結合使用。此裝飾器可讓您以更直接的方式編寫非同步程式碼,其中yield 語句傳回 Deferred 物件。這些物件表示稍後將計算的值。
Twisted 可以在單獨的執行緒中執行這些計算,透過 send 將結果非同步傳回函數。這使得能夠創建結構上類似於過程函數的程式碼,同時利用回調和延遲物件的強大功能。
總之,send 透過允許在執行期間引入輸入值來擴展 Python 產生器的功能。這使得能夠創建更動態和互動的基於生成器的程式碼,如涉及 double_inputs 和 @defer.inlineCallbacks 的範例所示。
以上是Python 生成器中「send」函數的用途是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!