理解Python 產生器中「send」的作用
Python 中的「yield」關鍵字允許產生器產生值,從而允許關鍵字呼叫者迭代生成器的輸出。然而,生成器還提供了一個名為「send」的補充函數,它提供了額外的控制層。
“send”函數,記錄為“generator.send(value)”,允許呼叫者輸入一個值進入剛產生的生成器。此輸入值成為當前yield 表達式的結果。重要的是,它與第一次實例化時傳遞給生成器函數的參數值不同。
為了說明這一點,請考慮以下生成器:
<code class="python">def double_inputs(): while True: x = yield # Pauses the generator yield x * 2 # Returns the doubled value</code>
最初,呼叫next(gen)在生成器物件gen 上,將其執行推進到第一個yield 語句。此時,我們可以利用「傳送」功能來輸入一個值。例如,執行 gen.send(10) 會將 x 設定為 10 並恢復生成器,從而產生 20。
<code class="python">gen = double_inputs() next(gen) # Pause at first yield gen.send(10) # Send input value of 10 20</code>
可以重複此過程,從而允許將多個輸入發送到生成器。值得注意的是,這種功能不能只透過「yield」機制來實現。
「send」功能的一個實際應用是在 Twisted 的 @defer.inlineCallbacks 裝飾器的上下文中。它允許創建類似於標準過程函數但可以執行非同步計算和回調的函數。
例如,使用「傳送」函數,可以將以下程式碼現代化:
<code class="python"># Old approach with callbacks def doStuff(): returnDeferred = defer.Deferred() def gotNextResult(nextResult): returnDeferred.callback(nextResult / 10) def gotResult(result): takesTenSeconds(result * 10).addCallback(gotNextResult) takesTwoSeconds().addCallback(gotResult) return returnDeferred # New approach using @defer.inlineCallbacks @defer.inlineCallbacks def doStuff(): result = yield takesTwoSeconds() nextResult = yield takesTenSeconds(result * 10) defer.returnValue(nextResult / 10)</code>
透過了解「傳送」功能的用途和功能,開發者可以在更廣泛的程式設計場景中釋放生成器的潛能。
以上是Python 的「send」函數如何允許與生成器進行雙向通訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!