Maison  >  Article  >  développement back-end  >  Comment la fonction « envoyer » de Python permet-elle une communication bidirectionnelle avec les générateurs ?

Comment la fonction « envoyer » de Python permet-elle une communication bidirectionnelle avec les générateurs ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-02 19:12:30322parcourir

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

Comprendre le rôle de « envoyer » dans les générateurs Python

Le mot-clé « yield » en Python permet aux générateurs de générer des valeurs, permettant à l'appelant pour parcourir la sortie du générateur. Cependant, les générateurs fournissent également une fonction complémentaire appelée "send", qui offre une couche de contrôle supplémentaire.

La fonction "send", documentée sous le nom "generator.send(value)", permet à l'appelant de saisir un valeur dans un générateur qui vient de céder. Cette valeur d'entrée devient le résultat de l'expression de rendement actuelle. Il est important de noter qu'elle est distincte de la valeur d'argument transmise à la fonction génératrice lors de sa première instanciation.

Pour illustrer, considérons le générateur suivant :

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

Initialement, appeler next(gen) sur l'objet générateur, gen avance son exécution jusqu'à la première instruction rendement. À ce stade, nous pouvons utiliser la fonction « envoyer » pour saisir une valeur. Par exemple, l'exécution de gen.send(10) définira x sur 10 et reprendra le générateur, ce qui lui donnera 20.

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

Ce processus peut être répété, permettant d'envoyer plusieurs entrées au générateur. . Il convient de noter que cette capacité ne peut pas être obtenue uniquement via le mécanisme « rendement ».

Une application pratique de la fonction « envoyer » se situe dans le contexte du décorateur @defer.inlineCallbacks de Twisted. Il permet de créer des fonctions qui ressemblent à des fonctions procédurales standards mais peuvent effectuer des calculs et des rappels asynchrones.

Par exemple, en utilisant la fonction "envoyer", le code suivant peut être modernisé :

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

En comprenant l'objectif et les capacités de la fonction « envoyer », les développeurs peuvent libérer le potentiel des générateurs dans un plus large éventail de scénarios de programmation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn