Heim > Artikel > Backend-Entwicklung > Wie ermöglicht die „Send“-Funktion von Python eine bidirektionale Kommunikation mit Generatoren?
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>
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>
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>
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!