Python3 Iteratoren und Generatoren
Iterator
Die Iteration ist eine der leistungsstärksten Funktionen von Python und eine Möglichkeit, auf Sammlungselemente zuzugreifen.
Ein Iterator ist ein Objekt, das sich die Position der Traversierung merken kann.
Das Iteratorobjekt beginnt mit dem Zugriff beim ersten Element der Sammlung und fährt fort, bis auf alle Elemente zugegriffen wurde. Iteratoren können nur vorwärts, nicht rückwärts gehen.
Iteratoren haben zwei grundlegende Methoden:iter()undnext()。
Zeichenketten, Listen oder Tupelobjekte können alle zum Erstellen von Iteratoren verwendet werden:
Beispiel (Python 3.0+)
>>> it = iter(list) # Ein Iteratorobjekt erstellen
>>> print (next(it)) # Das nächste Element des Iterators ausgeben
1
>>> print (next(it))
2
>>>
Iteratorobjekte können mit einer regulären for-Anweisung durchlaufen werden:
Beispiel (Python 3.0+)
Das Ausführen des obigen Programms erzeugt die folgende Ausgabe:
1 2 3 4
Sie können auch die Funktion next() verwenden:
Beispiel (Python 3.0+)
Das Ausführen des obigen Programms erzeugt die folgende Ausgabe:
1 2 3 4
Einen Iterator erstellen
Um eine Klasse als Iterator zu verwenden, müssen Sie zwei Methoden in der Klasse implementieren: __iter__() und __next__().
Wenn Sie bereits objektorientierte Programmierung verstehen, wissen Sie, dass Klassen einen Konstruktor haben. Der Konstruktor von Python ist __init__(), der ausgeführt wird, wenn das Objekt initialisiert wird.
Weitere Informationen finden Sie unter:Objektorientierte Programmierung mit Python3
Die Methode __iter__() gibt ein spezielles Iterator-Objekt zurück, das die Methode __next__() implementiert und das Ende der Iteration durch eine StopIteration-Ausnahme signalisiert.
Die Methode __next__() (next() in Python 2) gibt das nächste Iterator-Objekt zurück.
Erstellen Sie einen Iterator, der Zahlen zurückgibt, mit einem Anfangswert von 1 beginnt und bei jedem Schritt um 1 erhöht wird:
Beispiel (Python 3.0+)
Die Ausgabe nach der Ausführung ist:
1 2 3 4 5
StopIteration
Die StopIteration-Ausnahme wird verwendet, um den Abschluss der Iteration zu signalisieren und Endlosschleifen zu verhindern. In der __next__()-Methode können wir sie so einstellen, dass sie die StopIteration-Ausnahme auslöst, nachdem eine festgelegte Anzahl von Schleifen abgeschlossen wurde, um die Iteration zu beenden.
Ausführung nach 20 Iterationen beenden:
Beispiel (Python 3.0+)
Die Ausgabe nach der Ausführung ist:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Generator
In Python heißen Funktionen, die `yield` verwenden,yieldGeneratoren (generator).
yield`yield` ist ein Schlüsselwort, das verwendet wird, um Generatorfunktionen zu definieren. Eine Generatorfunktion ist eine spezielle Art von Funktion, die Werte während einer Iteration Schritt für Schritt erzeugen kann, anstatt alle Ergebnisse auf einmal zurückzugeben.
Im Gegensatz zu gewöhnlichen Funktionen ist ein Generator eine Funktion, die einen Iterator zurückgibt und nur für Iterationsvorgänge verwendet werden kann. Einfach gesagt, ein Generator ist ein Iterator.
Wenn `yield` in einer Generatorfunktionyield-Anweisung verwendet wird, wird die Ausführung der Funktion angehalten, undyieldder Ausdruck nach `yield` wird als Wert der aktuellen Iteration zurückgegeben.
Dann wird jedes Mal, wenn dienext()`__next__()`-Methode des Generators aufgerufen oderforeine `for`-Schleife zur Iteration verwendet wird, die Ausführung der Funktion an der Stelle fortgesetzt, an der sie zuletzt angehalten wurde, bis sie auf ein weiteresyield trifft`yield`-Anweisung. Auf diese Weise kann die Generatorfunktion Werte Schritt für Schritt erzeugen, ohne alle Ergebnisse auf einmal berechnen und zurückgeben zu müssen.
Der Aufruf einer Generatorfunktion gibt ein Iteratorobjekt zurück.
Das folgende ist ein einfaches Beispiel, das die Verwendung von Generatorfunktionen demonstriert:
Beispiel
Im obigen Beispiel ist die Funktioncountdowneine Generatorfunktion. Sie verwendet yield-Anweisungen, um schrittweise Countdown-Zahlen von n bis 1 zu erzeugen. Jedes Mal, wenn eine yield-Anweisung ausgeführt wird, gibt die Funktion den aktuellen Countdown-Wert zurück und setzt beim nächsten Aufruf die Ausführung an der Stelle fort, an der sie zuletzt angehalten wurde.
Durch das Erstellen eines Generatorobjekts und die Verwendung der Funktion next() oder einer for-Schleife, um über den Generator zu iterieren, können wir schrittweise die von der Generatorfunktion erzeugten Werte erhalten. In diesem Beispiel verwenden wir zuerst die Funktion next(), um die ersten drei Countdown-Werte zu erhalten, und dann eine for-Schleife, um die verbleibenden zwei zu erhalten.
Der Vorteil von Generatorfunktionen besteht darin, dass sie Werte bei Bedarf erzeugen können, wodurch vermieden wird, eine große Datenmenge auf einmal zu generieren und viel Speicher zu belegen. Darüber hinaus können Generatoren nahtlos mit anderen Iterationswerkzeugen (wie for-Schleifen) zusammenarbeiten und bieten eine prägnante und effiziente Iterationsmethode.
Das Ausführen des obigen Programms erzeugt die folgende Ausgabe:
5 4 3 2 1
Das folgende Beispiel verwendet yield, um die Fibonacci-Folge zu implementieren:
Beispiel (Python 3.0+)
Das Ausführen des obigen Programms erzeugt die folgende Ausgabe:
0 1 1 2 3 5 8 13 21 34 55Andere Erweiterungen