Comment fonctionne la fonction « envoyer » avec les générateurs Python, et quelles sont ses applications pratiques ?

DDD
Libérer: 2024-11-01 13:16:02
original
261 Les gens l'ont consulté

How does the

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!