Heim >Backend-Entwicklung >Python-Tutorial >Python-detaillierte Erklärung der Yield-Nutzung
Yield ist einfach ein Generator. Ein Generator ist eine Funktion, die sich die Position im Funktionskörper merkt, als sie zuletzt zurückgegeben wurde. Der zweite (oder n-te) Aufruf einer Generatorfunktion springt in die Mitte der Funktion und lässt alle lokalen Variablen gegenüber dem vorherigen Aufruf unverändert.
Der Generator ist eine Funktion
Alle Parameter der Funktion bleiben erhalten
Wenn diese Funktion zum zweiten Mal aufgerufen wird
Die verwendeten Parameter sind vom vorherigen Mal beibehalten.
Der Generator „merkt“ sich auch seinen Datenstatus im Flusskontrollkonstruktor
Der Generator „merkt“ sich nicht nur seinen Datenstatus. Der Generator „merkt“ sich auch seine Position innerhalb des Flusskontrollkonstrukts (in der imperativen Programmierung ist dieses Konstrukt nicht nur ein Datenwert). Kontinuität ist immer noch relativ allgemein, da Sie damit beliebig zwischen Ausführungsrahmen springen können, ohne immer zum Kontext des unmittelbaren Aufrufers zurückzukehren (wie bei Generatoren).
Der Funktionsmechanismus des Ertragsgenerators
Wenn Sie den Generator nach einer Zahl fragen, wird der Generator ausgeführt, bis die Ertragsangabe erscheint. Der Generator gibt Ihnen die Ertragsparameter und dann die Generator Es läuft nicht weiter. Wenn Sie ihn nach der nächsten Zahl fragen, beginnt er vom letzten Zustand aus zu laufen, bis die Yield-Anweisung erscheint, gibt Ihnen die Parameter und stoppt dann. Wiederholen Sie dies, bis die Funktion beendet wird.
Beispiel: Python-Permutations- und Kombinationsgenerator
#Vollständige Permutation generieren
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
#Kombinationen generieren
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
Die Ergebnisse sind wie folgt:
102 pvopf006 ~/test> ./generator.py
abc
----------------- - -
acb
bac
bca
cab
cba
Wie Sie sehen können, in der erste Nach der Schleifenunterbrechung wird der Generator nicht weiter ausgeführt und die zweite Schleife wird nach der ersten Schleife ausgeführt