Maison  >  Article  >  développement back-end  >  Explication détaillée de l'utilisation du rendement en Python

Explication détaillée de l'utilisation du rendement en Python

高洛峰
高洛峰original
2017-03-17 16:57:082634parcourir

yield est simplement un générateur Le générateur est une telle fonction qui se souvient de la position dans le corps de la fonction lors de son dernier retour. Le deuxième (ou nième) appel à une fonction génératrice saute au milieu de la fonction, laissant toutes les variables locales inchangées par rapport à l'appel précédent.

Le générateur est une fonction

Tous les paramètres de la fonction seront conservés

Lorsque cette fonction sera appelée une deuxième fois

Les paramètres utilisés sont conservé de la fois précédente Le générateur .

"se souvient" également de son

état de données

dans le constructeur de contrôle de flux . Le générateur « se souvient » également de sa position dans la construction de contrôle de flux (en programmation impérative, cette construction n'est pas seulement une valeur de données). La continuité est encore relativement générale puisqu'elle permet de sauter arbitrairement entre les frames d'exécution sans toujours revenir au contexte de l'appelant immédiat (comme avec les générateurs).

Le mécanisme de fonctionnement du générateur de rendement

Lorsque vous demandez un numéro au générateur, le générateur s'exécutera jusqu'à ce que l'instruction de rendement apparaisse. Le générateur vous donne les paramètres de rendement, puis le. générateur Il ne continuera pas à fonctionner. Lorsque vous lui demandez le numéro suivant, il commencera à courir à partir du dernier état jusqu'à ce que l'instruction de rendement apparaisse, vous donnera les paramètres, puis s'arrêtera. Répétez cette opération jusqu'à ce que la fonction se termine.

Exemple : Python permutation, générateur de combinaison

#Générer une permutation complète

def perm(items, n=None):
    if n is None:
        n = len(items)
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[:i] + items[i+1:]
            for p in perm(rest, n-1):
                yield v + p

#Générer une combinaison

def comb(items, n=None):
    if n is None:
        n = len(items)    
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[i+1:]
            for c in comb(rest, n-1):
                yield v + c
 
a = perm('abc')
for b in a:
    print b
    break
print '-'*20
for b in a:
    print b

Les résultats sont les suivants :

102 pvopf006 ~/test> ./generator.py

abc

----------- -- -------

acb

bac

bca

cab

cba

Vous pouvez le regarder. À ce stade, après la première rupture de boucle, le générateur ne continue pas à s'exécuter et la deuxième boucle s'exécute après la première boucle

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