Mit der Listengenerierung können wir direkt eine Liste erstellen. Aufgrund von Speicherbeschränkungen ist die Listenkapazität jedoch definitiv begrenzt. Darüber hinaus nimmt die Erstellung einer Liste mit 1 Million Elementen nicht nur viel Speicherplatz in Anspruch, sondern wenn wir nur auf die ersten paar Elemente zugreifen müssen, wird der von den meisten nachfolgenden Elementen belegte Platz verschwendet. Wenn also die Elemente der Liste nach einem bestimmten Algorithmus berechnet werden können, können wir dann die nachfolgenden Elemente während der Schleife kontinuierlich berechnen? Dadurch entfällt die Notwendigkeit, eine vollständige Liste zu erstellen, was viel Platz spart. In Python wird dieser Mechanismus der gleichzeitigen Schleife und Berechnung als Generator bezeichnet: Generator.
Es gibt viele Möglichkeiten, einen Generator zu erstellen. Die erste Methode ist sehr einfach: Ändern Sie einfach das [ ] einer Listengenerierung in ( )
Der Unterschied zwischen der Erstellung von L und G besteht nur im äußersten [ ] und ( ), L ist eine Liste und G ist es ein Generator. Wir können jedes Element von L direkt ausdrucken, aber wie drucken wir jedes Element von G aus? Wenn Sie sie einzeln ausdrucken möchten, können Sie den nächsten Rückgabewert des Generators über die Funktion next() abrufen:
Der Generator speichert den Algorithmus, und jedes Mal, wenn next( G heißt), wird der Wert des nächsten Elements von G berechnet, bis das letzte Element berechnet ist. Wenn keine weiteren Elemente vorhanden sind, wird eine StopIteration-Ausnahme ausgelöst. Natürlich ist dieser kontinuierliche Aufruf von next() wirklich ungewöhnlich. Die richtige Methode ist die Verwendung einer for-Schleife, da der Generator auch ein iterierbares Objekt ist. Nachdem wir also einen Generator erstellt haben, rufen wir grundsätzlich nie next() auf, sondern iterieren ihn durch eine for-Schleife und müssen uns nicht um die StopIteration-Ausnahme kümmern.
Generator ist sehr leistungsstark. Wenn der Berechnungsalgorithmus relativ komplex ist und nicht über eine for-Schleife ähnlich der Listengenerierung implementiert werden kann, kann er auch über eine Funktion implementiert werden.
Zum Beispiel kann in der berühmten Fibonacci-Folge mit Ausnahme der ersten und zweiten Zahl jede beliebige Zahl durch Addition der ersten beiden Zahlen erhalten werden:
1 , 1, 2, 3, 5 , 8, 13, 21, 34, ...
Die Fibonacci-Folge kann nicht mit der Listengenerierung geschrieben werden, aber es ist einfach, sie mit einer Funktion auszudrucken:
Wenn Sie genau hinsehen, können Sie erkennen, dass die Fib-Funktion tatsächlich definiert ist. Nachdem Sie die Berechnungsregeln der Fibonacci-Folge verstanden haben, können Sie kann mit dem ersten Element beginnen und alle nachfolgenden Elemente berechnen. Diese Logik ist tatsächlich dem Generator sehr ähnlich.
Mit anderen Worten, die obige Funktion ist nur einen Schritt vom Generator entfernt. Um die Fib-Funktion in einen Generator umzuwandeln, ändern Sie einfach print(b), um b zu erhalten:
Aber als ich den Generator mit einer for-Schleife aufrief, stellte ich fest, dass ich den Rückgabewert der Return-Anweisung des Generators nicht erhalten konnte. Wenn Sie den Rückgabewert erhalten möchten, müssen Sie den StopIteration-Fehler erfassen. Der Rückgabewert ist im Wert von StopIteration enthalten:
Beispiel: Bei der Ausführung von yield wird die gen-Funktion vorübergehend gespeichert und gibt den Wert von i zurück; temp empfängt das nächste Mal c.send("python"), den von gesendeten Wert send, c .next() entspricht c.send(None)
Nächste Funktion verwenden
Methode __next__() verwenden
Senden verwenden
Laufergebnisse:
Simulieren Multitasking-Implementierung Eins: Coroutine
Zusammenfassung
Generator ist eine Funktion, die sich die Position im Funktionskörper bei ihrer letzten Rückkehr merkt. 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.
Ein Generator „merkt“ sich nicht nur den Zustand seiner Daten; ein Generator „merkt“ sich auch seine Position innerhalb eines Flusskontrollkonstrukts (in der imperativen Programmierung ist dieses Konstrukt nicht nur ein Datenwert).
Funktionen des Generators:
1. Beim Iterieren zum nächsten Aufruf bleiben alle verwendeten Parameter vom ersten Mal an erhalten Das heißt, die Parameter aller Funktionsaufrufe bleiben beim ersten Aufruf erhalten und werden nicht neu erstellt.
5 Iterator
1. Iterierbare Objekte
Ein Typ sind Sammlungsdatentypen wie Liste, Tupel, Diktat, set, str usw.;
Eine Kategorie ist Generator, einschließlich Generator und Generatorfunktion mit Ertrag.
Diese Objekte, die direkt in for-Schleifen verwendet werden können, werden zusammenfassend als iterierbare Objekte bezeichnet: Iterable.
2. Bestimmen Sie, ob es iterierbar ist
3. Iterator
Um list, dict, str und andere Iterables in Iterator zu konvertieren, können Sie die Funktion iter() verwenden:
Zusammenfassung
·Alle Objekte, die in for-Schleifen verwendet werden können, sind vom Typ Iterable;
·Alle Objekte, die in der Funktion next() verwendet werden können, sind vom Typ Iterator
·Sammlungsdatentypen wie list, dict, str usw. sind iterierbar, aber nicht Iterator, aber Sie können ein Iterator-Objekt über die Funktion iter() erhalten.
·Der Zweck besteht darin, den belegten Inhalt bei der Verwendung von Sammlungen zu reduzieren.
1. Funktionsreferenz
In diesem Beispiel bilden die Funktionszeile und die Variablen a und b einen Abschluss. Beim Erstellen des Abschlusses geben wir die Werte dieser beiden Variablen über die Parameter a und b von line_conf an. Auf diese Weise bestimmen wir die endgültige Form der Funktion (y = x + 1 und y = 4x + 5). Wir müssen nur die Parameter a und b transformieren, um unterschiedliche gerade Ausdrucksfunktionen zu erhalten. Daraus können wir ersehen, dass Schließungen auch die Wirkung haben, die Wiederverwendbarkeit von Code zu verbessern.
Wenn es keinen Abschluss gibt, müssen wir jedes Mal, wenn wir eine Geradenfunktion erstellen, a, b, x angeben. Auf diese Weise müssen wir mehr Parameter übergeben, was auch die Portabilität des Codes verringert
Wenn Sie während des Lernprozesses auf Probleme stoßen oder Lernressourcen erhalten möchten, können Sie gerne der Lernaustauschgruppe beitreten
626062078, wir lernen gemeinsam Python!
Das obige ist der detaillierte Inhalt vonPython-detaillierte Erklärung der Generatoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!