Heim  >  Artikel  >  Backend-Entwicklung  >  Wie ermöglicht die „Send“-Funktion von Python eine bidirektionale Kommunikation mit Generatoren?

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

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 19:12:30322Durchsuche

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>

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!

Stellungnahme:
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