Maison > Article > développement back-end > Quel est le but de la fonction « envoyer » dans les générateurs Python ?
Exploration de l'objectif de la fonction "envoyer" des générateurs en Python
Generators, le puissant outil de Python pour créer des itérateurs personnalisés, offre non seulement le mot clé rendement mais aussi une fonction moins connue mais tout aussi importante : envoyer. Contrairement à Yield, qui fournit une sortie du générateur, send vous permet d'interagir avec le générateur pendant son exécution, en introduisant des entrées pour guider son comportement.
La documentation décrit send comme l'envoi d'une valeur dans la fonction du générateur, ce qui la rend le résultat actuel de l’expression de rendement. Cela diffère subtilement de l'objectif principal de rendement, qui renvoie la valeur générée suivante. Alors, qu'implique exactement cet écart ?
Exemple : Dévoiler le pouvoir de l'envoi
Considérez le générateur suivant :
<code class="python">def double_inputs(): while True: x = yield yield x * 2</code>
Ce générateur donne le double des valeurs qui lui sont envoyées via send. En utilisant send dans l'exécution du générateur, nous pouvons observer son comportement :
<code class="python">>>> gen = double_inputs() >>> next(gen) # Execute until the first yield >>> gen.send(10) # Send value into the generator 20 >>> next(gen) # Execute until the next yield >>> gen.send(6) 12 >>> next(gen) # Execute until the next yield >>> gen.send(94.3) 188.5999999999999</code>
Sans la fonction send, cette fonctionnalité serait impossible à réaliser en utilisant le seul rendement.
Application pratique : @defer.inlineCallbacks dans Twisted
L'un des cas d'utilisation les plus convaincants pour l'envoi réside en conjonction avec @defer.inlineCallbacks de Twisted. Ce décorateur vous permet d'écrire du code asynchrone de manière plus simple, où les instructions rendement renvoient des objets différés. Ces objets représentent des valeurs qui seront calculées ultérieurement.
Twisted peut exécuter ces calculs dans des threads séparés, en renvoyant les résultats de manière asynchrone à la fonction via send. Cela permet de créer un code dont la structure ressemble à des fonctions procédurales tout en exploitant simultanément la puissance des rappels et des objets différés.
En résumé, send étend les capacités des générateurs Python en permettant l'introduction de valeurs d'entrée pendant l'exécution. Cela permet la création d'un code basé sur un générateur plus dynamique et interactif, comme le démontrent les exemples impliquant double_inputs et @defer.inlineCallbacks.
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!