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+)

>>> Liste=[1,2,3,4]
>>> 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+)

#!/usr/bin/python3 list=[1,2,3,4] it = iter(list) # Ein Iteratorobjekt erstellen for x in it: print (x, end=" ")

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+)

#!/usr/bin/python3 import sys # Das sys-Modul importieren list=[1,2,3,4] it = iter(list) # Ein Iteratorobjekt erstellen while True: try: print (next(it)) except StopIteration: sys.exit()

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+)

class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): x = self.a self.a += 1 return x myclass = MyNumbers() myiter = iter(myclass) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter)) print(next(myiter))

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+)

class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 20: x = self.a self.a += 1 return x else: raise StopIteration myclass = MyNumbers() myiter = iter(myclass) for x in myiter: print(x)

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

def countdown(n): while n > 0: yield n n -= 1 # Generatorobjekt erstellen generator = countdown(5) # Werte durch Iterieren über den Generator abrufen print(next(generator)) # Ausgabe: 5 print(next(generator)) # Ausgabe: 4 print(next(generator)) # Ausgabe: 3 # Verwende eine for-Schleife, um über den Generator zu iterieren for value in generator: print(value) # Ausgabe: 2 1

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+)

#!/usr/bin/python3 import sys def fibonacci(n): # Generatorfunktion - Fibonacci a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1 f = fibonacci(10) # f ist ein Iterator, der vom Generator zurückgegeben und erzeugt wird while True: try: print (next(f), end=" ") except StopIteration: sys.exit()

Das Ausführen des obigen Programms erzeugt die folgende Ausgabe:

0 1 1 2 3 5 8 13 21 34 55
Andere Erweiterungen