Maison  >  Article  >  développement back-end  >  Introduction à l'utilisation de rendement en python (avec code)

Introduction à l'utilisation de rendement en python (avec code)

不言
不言avant
2019-02-22 14:49:111912parcourir

Cet article vous présente une introduction à l'utilisation de rendement dans l'applet WeChat python (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Tout d'abord, si vous n'avez pas une compréhension préliminaire du rendement, alors vous considérez d'abord le rendement comme un « retour ». C'est intuitif. C'est avant tout un retour. ? Une certaine valeur est renvoyée dans le programme. Après le retour, le programme ne s'exécutera plus. Après l'avoir vu comme un retour, considérez-le comme faisant partie d'un générateur (la fonction avec rendement est le véritable itérateur). Eh bien, si vous ne les comprenez pas, traitez d'abord le rendement comme un retour. et vous comprendrez toute la signification de rendement :

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))

Quelques lignes de code vous permettront de comprendre ce qu'est le rendement. Le résultat du code est le suivant :

starting...
4
********************
res: None
4
.

J'explique directement la séquence d'exécution du code, qui équivaut au débogage du code en une seule étape :

1 Une fois que le programme commence à s'exécuter, car il y a le mot-clé rendement dans la fonction foo, le foo. la fonction ne s'exécutera pas vraiment, mais obtenez d'abord un générateur g (équivalent à un objet)

2. Jusqu'à ce que la méthode suivante soit appelée, la fonction foo commence officiellement à s'exécuter. Exécutez d'abord la méthode print dans la fonction foo. , puis entrez la boucle while

3. Le programme rencontre le mot-clé rendement, puis considère le rendement comme un retour. Après avoir renvoyé un 4, le programme s'arrête sans exécuter l'opération res. l'instruction next(g) est terminée. Ainsi, les deux premières lignes de sortie (la première est le résultat de print ci-dessus tandis que la seconde est le résultat de return) sont les résultats de l'exécution de print(next(g)),

4. Le programme exécute print (""20), sortie 20 *

5. Recommencez l'exécution du print(next(g)) suivant, cette fois c'est le cas. similaire à celui ci-dessus, mais la différence est que ceci À ce moment, l'exécution commence à l'endroit où le programme suivant s'est arrêté, c'est-à-dire que l'opération d'affectation de res doit être effectuée à ce moment-là, il convient de noter qu'il n'y en a pas. valeur sur le côté droit de l'opération d'affectation à ce moment (car celle qui vient d'être renvoyée a été renvoyée et aucune valeur n'a été donnée. Les paramètres sont passés sur le côté gauche de l'opération d'affectation), donc à ce moment l'affectation res est Aucune, donc la sortie suivante est res:None,

6. Le programme continuera à s'exécuter pendant ce temps et rencontrera à nouveau le rendement. Cette fois, retournez les sorties 4, puis le programme s'arrête. function est la 4 sortie de ce retour.

À ce stade, vous pouvez comprendre la relation et la différence entre le rendement et le retour. La fonction avec rendement est un générateur de génération au lieu d'une fonction. qui est la fonction suivante. Next équivaut au nombre généré dans "l'étape suivante". Cette fois, le point de départ de next est exécuté à partir de l'endroit où le dernier next s'est arrêté, donc lors de l'appel de next, le générateur ne s'exécutera pas. depuis le début de la fonction foo, mais continuera simplement là où l'étape précédente s'est arrêtée. Ensuite, après avoir rencontré le rendement, le nombre à générer sera renvoyé et cette étape se terminera.

def foo():
    print("starting...")
    while True:
        res = yield 4
        print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(g.send(7))

Regardons un autre exemple de la fonction d'envoi de ce générateur. Cet exemple remplace la dernière ligne de l'exemple ci-dessus, et le résultat de sortie est :

starting...
4
********************
res: 7
4

Parlons-en. à ce sujet brièvement. Examinons le concept de la fonction send : à ce stade, vous devriez remarquer le mot violet ci-dessus, et pourquoi la valeur de res ci-dessus est None, et celle-ci devient 7. Pourquoi est-ce parce que send envoie un ? paramètre à res. Oui, car comme mentionné ci-dessus, 4 n'est pas affecté à res lors du retour, la prochaine fois qu'il est exécuté, il doit continuer à effectuer l'opération d'affectation et doit l'affecter à None. il commence à s'exécuter, il continuera. Une fois exécuté (après le retour 4), 7 est d'abord affecté à res, puis la fonction suivante est exécutée Lorsque le prochain rendement est rencontré, le résultat est renvoyé et se termine.

5. Le programme exécute g.send(7), et le programme continuera à s'exécuter vers le bas à partir de la ligne de mot-clé rendement, et send attribuera la valeur 7 à la variable res

6. .Depuis que send La méthode contient la méthode next(), le programme continuera donc à s'exécuter vers le bas pour exécuter la méthode print, puis entrera à nouveau dans la boucle while

7 Une fois que l'exécution du programme aura rencontré à nouveau le mot-clé rendement. , rendement renverra la valeur suivante et le programme fera à nouveau une pause jusqu'à ce que la méthode ou la méthode d'envoi suivante soit à nouveau appelée.

C'est tout. Parlons de pourquoi nous utilisons ce générateur C'est parce que si nous utilisons List, cela prendra plus d'espace. ...........1000

Vous pourriez ressembler à ceci :

for n in range(1000):
    a=n

À ce moment, range(1000) générera une liste contenant 1000 nombres par défaut . , donc cela prend beaucoup de mémoire.

À l'heure actuelle, vous pouvez utiliser la combinaison de rendement tout de suite pour former un générateur à implémenter, ou vous pouvez utiliser le générateur xrange(1000) pour implémenter la

combinaison de rendement :

def foo(num):
    print("starting...")
    while num<10:
        num=num+1
        yield num
for n in foo(0):
    print(n)

Sortie :

starting...
1
2
3
4
5
6
7
8
9
10

xrange(1000) :

for n in xrange(1000):
    a=n

Il convient de noter qu'il n'y a pas de xrange() en python3, range(). est xrange() Maintenant, vous pouvez vérifier le type de range() dans python3. C'est déjà une 33fd1d9057a47d4ff1348901e1b4a20c, pas une liste. Après tout, cela doit être optimisé.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer