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éesdans 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!