Maison >développement back-end >Tutoriel Python >Comment fonctionne la fonction « envoyer » avec les générateurs Python, et quelles sont ses applications pratiques ?
Utilisation de générateurs Python avec la fonction "envoyer"
Les générateurs en Python offrent un moyen de parcourir paresseusement une séquence de valeurs sans avoir à le faire stocker la séquence entière en mémoire. Le mot-clé rendement est utilisé pour générer les valeurs et suspendre l'exécution de la fonction génératrice. Cependant, il existe une autre méthode, appelée send, qui joue un rôle crucial dans l'utilisation des générateurs.
Objectif de la fonction "send"
La fonction send() sur Les générateurs Python permettent de reprendre l'exécution d'une fonction génératrice et de "envoyer" une valeur dedans. Cette valeur devient le résultat de l'expression de rendement actuelle. Contrairement à Yield, qui renvoie la valeur suivante générée par le générateur, send() renvoie la valeur qui a été envoyée au générateur.
Comprendre la fonction « envoyer »
Pour clarifier, imaginez une fonction génératrice qui génère une séquence de nombres doublés. En utilisant le rendement, vous pouvez récupérer le prochain nombre doublé :
<code class="python">def double_generator(): while True: x = yield yield x * 2</code>
Maintenant, supposons que vous souhaitiez envoyer une valeur de 10 dans ce générateur. En utilisant send(), vous pouvez faire ceci :
<code class="python">generator = double_generator() next(generator) # Initiate the generator result = generator.send(10) # Send 10 into the generator print(result) # Output: 20</code>
Dans cet exemple, l'appel send() reprend la fonction génératrice à partir du point où elle a donné (x = rendement), attribue la valeur envoyée (10 ) à la variable x, et renvoie le résultat de la prochaine instruction de rendement (yield x * 2), qui est 20.
Exemple de "envoyer" en pratique
L'utilisation de send() ne se limite pas aux simples générateurs de doublement. Cela peut être particulièrement utile lorsque vous souhaitez transmettre des valeurs dans une fonction génératrice et contrôler son exécution de manière dynamique. Par exemple, considérons le code suivant qui s'appuie sur send() :
<code class="python">@defer.inlineCallbacks def do_something(): result1 = yield long_running_process(10) result2 = yield long_running_process(result1 * 2) defer.returnValue(result2 / 10)</code>
Ce code utilise le décorateur @defer.inlineCallbacks de Twisted, qui permet d'écrire du code asynchrone comme s'il était synchrone. Ici, long_running_process() est une fonction qui prend un certain temps à se terminer et renvoie un Deferred.
Pendant l'exécution de do_something(), elle envoie des valeurs dans la fonction génératrice. Par exemple, après le rendement initial, l'exécution s'arrête jusqu'à ce que le Deferred renvoyé par long_running_process(10) soit résolu. Le résultat du Deferred est ensuite renvoyé dans le générateur, où il est affecté à la variable result1.
Ce flux dynamique permet d'écrire du code asynchrone plus complexe de manière plus simple, ce qui facilite l'écriture du code asynchrone plus complexe. travailler avec des processus asynchrones en Python.
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!