Als ich dem Blog von Liao Der Artikel fasst diese Konzepte zusammen.
GeneratorWörtlich genommen handelt es sich um einen Generator. Es gibt zwei Möglichkeiten, ihn zu implementieren: 1. Für Listengeneratoren. , es wird durch () dargestellt. (Es stellt sich heraus, dass dies ein Generatorausdruck genannt wird, haha)
Zugriffsmethode, Sie können für den Zugriff eine for-Schleife verwenden, Sie können auch .next für den Zugriff verwenden.
N = ['Hello', 'World', 18, 'Apple', 'None'] hh = (s.lower() for s in N if isinstance(s,str) ==True)print hh#for item in hh:# print item#print hh.next()#print hh.next()#print hh.next()#print hh.next()
world
apple
none
hh ist der vom Generator zurückgegebene Wert, ähnlich einem Array. Unterstützt den for-Schleifenzugriff und den .next()-Zugriff. Zu beachten ist, dass hh.next() nicht ausgeführt werden kann, nachdem die for-Schleife ausgeführt wurde, ähnlich wie wenn der Zeiger das Ende erreicht oder der Iterator in C++ auf das Ende zeigt und greift dann auf Es tritt ein Fehler auf.
2. Verwenden Sie yield zum Generieren (Generatorfunktion genannt)
Unabhängig davon, ob es mit next() oder einer for-Schleife aufgerufen wird, wird nach der Ausführung von yield der n-Wert zurückgegeben und dann der aktuell Der Status ist „Ausstehend“ und wird dann zurückgegeben.
def create_counter(n):print "create counter"#while True:while False:yield nprint 'increment n'n += 1cnt = create_counter(2)#print cntfor item in cnt:print item#print next(cnt)#print next(cnt)#print cnt.next()#print cnt.next()
an, dass es sich um einen Generator handelt.
Wenn es „Falsch“ ist, wird nur der Erstellungszähler gedruckt.
Wenn es „True“ ist, wird bei Verwendung einer for-Schleife eine Endlosschleife ausgeführt.
Coroutine:
Ich weiß, dass es Konzepte für Prozesse und Threads gibt, aber ich weiß wirklich nicht, was eine Coroutine ist.
Aus technischer Sicht of view Sagen Sie: „Eine Coroutine ist eine Funktion, deren Ausführung Sie anhalten können.“ Wenn Sie es als „einfach wie einen Generator“ verstehen, dann haben Sie Recht. Habe das in einem Artikel gesehen. Der Grund, warum Python eine hohe Ausführungseffizienz aufweist
1 Das Wechseln von Unterprogrammen ist kein Thread-Wechsel, sondern wird vom Programm selbst gesteuert. Im Vergleich zum Multithreading sind die Leistungsvorteile von Coroutinen umso offensichtlicher, je größer die Anzahl der Threads ist.2. Am Ausführungsprozess ist kein Sperrmechanismus beteiligt.
Im Anhang finden Sie ein einfaches Beispiel für Produzent und Verbraucher:
1. Die Verbraucherfunktion ist ein Generator.
2. c.send(None) entspricht tatsächlich next(c). Bei der ersten Ausführung wird es nur so lange ausgeführt, bis n = yield r ist, und stoppt dann und gibt dann den Wert von r zurück der Anrufer.
3. yield r ist ein Ausdruck, der von send(msg) zugewiesen wird, und send(msg) hat einen Rückgabewert: der Parameter des nächsten yield r-Ausdrucks, der r ist .
4. Sobald Produce etwas produziert, wechseln Sie über c.send(n) zur Consumer-Ausführung. Der Verbraucher erhält die Nachricht über yield, verarbeitet sie und sendet das Ergebnis über yield zurück. Mit anderen Worten, c.send(1) sendet nicht nur Daten an c, sondern wartet auch auf die nächste Rückgabe von Daten von c. Es hat einen Rückgabewert und ist erst nach einem Durchgang abgeschlossen Die zurückgegebenen Daten (200 OK) werden weiterhin ausgeführt.
5. Der gesamte Prozess ist sperrenfrei und wird von einem Thread ausgeführt. Hersteller und Verbraucher arbeiten zusammen, um die Aufgabe abzuschließen. Daher wird er als „Coroutine“ und nicht als präventives Multitasking von Threads bezeichnet.
Zusammenfassend ist yield r ein Ausdruck, der von c.send und dann zugewiesen wird Der Rückgabewert ist der nächste Parameter des yield r-Ausdrucks.
Das obige ist der detaillierte Inhalt vonEinführung in den Python-Generator-Generator. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!