Wie ermöglicht die „Send'-Funktion von Python eine bidirektionale Kommunikation mit Generatoren?

Linda Hamilton
Freigeben: 2024-11-02 19:12:30
Original
321 Leute haben es durchsucht

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

Die Rolle von „send“ in Python-Generatoren verstehen

Das Schlüsselwort „yield“ in Python ermöglicht es Generatoren, Werte zurückzugeben, was dem Aufrufer ermöglicht um über die Ausgabe des Generators zu iterieren. Allerdings bieten Generatoren auch eine ergänzende Funktion namens „send“, die eine zusätzliche Kontrollebene bietet.

Die „send“-Funktion, dokumentiert als „generator.send(value)“, ermöglicht dem Aufrufer die Eingabe eines Wert in einen Generator, der gerade nachgegeben hat. Dieser Eingabewert wird zum Ergebnis des aktuellen Ertragsausdrucks. Wichtig ist, dass er sich von dem Argumentwert unterscheidet, der an die Generatorfunktion übergeben wird, wenn diese zum ersten Mal instanziiert wird.

Betrachten Sie zur Veranschaulichung den folgenden Generator:

<code class="python">def double_inputs():
    while True:
        x = yield  # Pauses the generator
        yield x * 2  # Returns the doubled value</code>
Nach dem Login kopieren

Zunächst wird beim Aufruf von next(gen) Auf dem Generatorobjekt fährt gen mit der Ausführung zur ersten yield-Anweisung fort. An dieser Stelle können wir die Funktion „Senden“ verwenden, um einen Wert einzugeben. Wenn Sie beispielsweise gen.send(10) ausführen, wird x auf 10 gesetzt und der Generator fortgesetzt, was dazu führt, dass er 20 ergibt.

<code class="python">gen = double_inputs()
next(gen)       # Pause at first yield
gen.send(10)    # Send input value of 10
20</code>
Nach dem Login kopieren

Dieser Vorgang kann wiederholt werden, sodass mehrere Eingaben an den Generator gesendet werden können . Es ist erwähnenswert, dass diese Fähigkeit nicht allein durch den „Yield“-Mechanismus erreicht werden kann.

Eine praktische Anwendung der „Send“-Funktion ist im Kontext des @defer.inlineCallbacks-Dekorators von Twisted. Es ermöglicht die Erstellung von Funktionen, die standardmäßigen prozeduralen Funktionen ähneln, aber asynchrone Berechnungen und Rückrufe durchführen können.

Mit der Funktion „Senden“ kann beispielsweise der folgende Code modernisiert werden:

<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>
Nach dem Login kopieren

Durch das Verständnis des Zwecks und der Fähigkeiten der „Senden“-Funktion können Entwickler das Potenzial von Generatoren in einem breiteren Spektrum von Programmierszenarien erschließen.

Das obige ist der detaillierte Inhalt vonWie ermöglicht die „Send'-Funktion von Python eine bidirektionale Kommunikation mit Generatoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!