Python -Iteratoren
Python-Iteratoren
Ein Iterator ist ein Objekt, das eine zählbare Anzahl von Werten enthält.
Ein Iterator ist ein Objekt, das iteriert werden kann, was bedeutet, dass Sie alle Werte durchlaufen können.
Technisch gesehen ist ein Iterator in Python ein Objekt, das das Iteratorprotokoll implementiert, das aus den Methoden __iter__()
und besteht __next__()
.
Iterator vs. iterierbar
Listen, Tupel, Wörterbücher und Mengen sind alles iterierbare Objekte. Sie sind iterierbare Container , aus denen Sie einen Iterator erhalten können.
Alle diese Objekte haben eine iter()
Methode, die verwendet wird, um einen Iterator zu erhalten:
Beispiel
Geben Sie einen Iterator aus einem Tupel zurück und geben Sie jeden Wert aus:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Sogar Strings sind iterierbare Objekte und können einen Iterator zurückgeben:
Beispiel
Strings sind ebenfalls iterierbare Objekte, die eine Folge von Zeichen enthalten:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
Durchlaufen eines Iterators
Wir können auch eine for
Schleife verwenden, um ein iterierbares Objekt zu durchlaufen:
Beispiel
Werte eines Tupels iterieren:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
Beispiel
Iterieren Sie die Zeichen einer Zeichenfolge:
mystr = "banana"
for x in mystr:
print(x)
Die for
Schleife erstellt tatsächlich ein Iteratorobjekt und führt die Methode next() für jede Schleife aus.
Erstellen Sie einen Iterator
Um ein Objekt/eine Klasse als Iterator zu erstellen, müssen Sie die Methoden
__iter__()
und
__next__()
zu Ihrem Objekt implementieren.
Wie Sie im Kapitel „ Python-Klassen/Objekte “ gelernt haben , haben alle Klassen eine Funktion namens
__init__()
, mit der Sie einige Initialisierungen vornehmen können, wenn das Objekt erstellt wird.
Die __iter__()
Methode verhält sich ähnlich, Sie können Operationen ausführen (Initialisieren usw.), müssen aber immer das Iterator-Objekt selbst zurückgeben.
Die __next__()
Methode ermöglicht Ihnen auch Operationen und muss das nächste Element in der Sequenz zurückgeben.
Beispiel
Erstellen Sie einen Iterator, der Zahlen zurückgibt, beginnend mit 1, und jede Sequenz wird um eins erhöht (gibt 1,2,3,4,5 usw. zurück):
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))
StopIteration
Das obige Beispiel würde endlos fortgesetzt werden, wenn Sie genügend next() -Anweisungen hätten oder wenn es in einer
for
Schleife verwendet würde.
Um zu verhindern, dass die Iteration ewig weitergeht, können wir die
StopIteration
Anweisung verwenden.
In der __next__()
Methode können wir eine Beendigungsbedingung hinzufügen, um einen Fehler auszulösen, wenn die Iteration eine bestimmte Anzahl von Malen durchgeführt wird:
Beispiel
Stopp nach 20 Iterationen:
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)