首頁  >  文章  >  後端開發  >  Python 生成器中「send」函數的真正用途是什麼?

Python 生成器中「send」函數的真正用途是什麼?

Linda Hamilton
Linda Hamilton原創
2024-11-02 11:46:30489瀏覽

What is the true purpose of the

屏蔽產生器「傳送」函數的目的

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn