Bagaimanakah fungsi `send` Python membenarkan komunikasi dua hala dengan penjana?

Linda Hamilton
Lepaskan: 2024-11-02 19:12:30
asal
394 orang telah melayarinya

How does Python's `send` function allow for two-way communication with generators?

Memahami Peranan "hantar" dalam Penjana Python

Kata kunci "hasil" dalam Python membenarkan penjana menghasilkan nilai, membenarkan pemanggil untuk mengulangi keluaran penjana. Walau bagaimanapun, penjana juga menyediakan fungsi pelengkap yang dipanggil "hantar", yang menawarkan lapisan kawalan tambahan.

Fungsi "hantar", yang didokumenkan sebagai "generator.send(value)", membenarkan pemanggil untuk memasukkan a nilai ke dalam penjana yang baru sahaja menghasilkan. Nilai input ini menjadi hasil daripada ungkapan hasil semasa. Yang penting, ia berbeza daripada nilai hujah yang dihantar kepada fungsi penjana apabila ia mula-mula digunakan.

Untuk menggambarkan, pertimbangkan penjana berikut:

<code class="python">def double_inputs():
    while True:
        x = yield  # Pauses the generator
        yield x * 2  # Returns the doubled value</code>
Salin selepas log masuk

Pada mulanya, memanggil next(gen) pada gen objek penjana memajukan pelaksanaannya kepada pernyataan hasil pertama. Pada ketika ini, kita boleh menggunakan fungsi "hantar" untuk memasukkan nilai. Sebagai contoh, melaksanakan gen.send(10) akan menetapkan x kepada 10 dan menyambung semula penjana, menyebabkan ia menghasilkan 20.

<code class="python">gen = double_inputs()
next(gen)       # Pause at first yield
gen.send(10)    # Send input value of 10
20</code>
Salin selepas log masuk

Proses ini boleh diulang, membenarkan berbilang input dihantar kepada penjana . Perlu diingat bahawa keupayaan ini tidak boleh dicapai semata-mata melalui mekanisme "hasil".

Satu aplikasi praktikal fungsi "hantar" adalah dalam konteks penghias @defer.inlineCallbacks Twisted. Ia membolehkan penciptaan fungsi yang menyerupai fungsi prosedur standard tetapi boleh melakukan pengiraan tak segerak dan panggil balik.

Sebagai contoh, menggunakan fungsi "hantar", kod berikut boleh dimodenkan:

<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>
Salin selepas log masuk

Dengan memahami tujuan dan keupayaan fungsi "hantar", pembangun boleh membuka kunci potensi penjana dalam rangkaian senario pengaturcaraan yang lebih luas.

Atas ialah kandungan terperinci Bagaimanakah fungsi `send` Python membenarkan komunikasi dua hala dengan penjana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan