In Python sind Iteratoren Objekte, die das Iterator-Protokoll implementieren: die Methoden __iter__() und __next__(). Iteratoren verwalten ihren internen Zustand und geben bei jedem Aufruf von next() das nächste Element der Sequenz zurück oder werfen die Ausnahme StopIteration, wenn das Ende erreicht ist.
Iterierbare Objekte sind die, über die man in einer Schleife iterieren kann (zum Beispiel Listen, Strings, Wörterbücher). Alle von ihnen haben die Methode __iter__(), die einen Iterator zurückgibt.
Um einen eigenen Iterator zu implementieren, muss man eine Klasse mit den Methoden __iter__() (gibt self zurück) und __next__() (implementiert die Logik zur Beschaffung des nächsten Elements) erstellen:
class Counter: def __init__(self, low, high): self.current = low self.high = high def __iter__(self): return self def __next__(self): if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1 for num in Counter(1, 3): print(num) # 1 2 3
Was sind die Unterschiede zwischen iterierbaren Objekten und Iteratoren? Kann man mehr als einmal über einen Iterator iterieren?
Antwort: Ein iterierbares Objekt implementiert nur die Methode __iter__(), die einen Iterator zurückgibt. Ein Iterator ist ein Objekt, das die Methode __next__() hat. Ein Iterator wird normalerweise nur einmal durchlaufen: Nach Erreichen des Endes der Sequenz ist eine erneute Iteration nicht möglich, ohne einen neuen Iterator zu erstellen.
Geschichte
In einem Projekt zur Protokollanalyse schrieb ein Entwickler eine Funktion, die einen Iterator entgegennahm und versuchte, ihn zweimal zu durchlaufen (
for log in logs:), in der Erwartung, dass beide Durchläufe dieselben Ergebnisse liefern würden. Die zweite Iteration gab nichts zurück, da der Iterator bereits "aufgebraucht" war.
Geschichte
In einem Modul gab ein Entwickler aus einer Funktion nicht eine Liste, sondern einen Generator zurück, der eine einmalige Iteration ermöglichte. Als er versuchte, ihn an eine andere Funktion zu übergeben, die ein iterierbares Objekt für mehrere Durchläufe erwartete, trat ein unerwarteter Fehler und ein leeres Ergebnis auf.
Geschichte
In einem Web-API-Projekt versuchte ein Entwickler, einen Iterator direkt in JSON zu serialisieren. Iteratoren sind keine Listen und eine Umwandlung ist ohne vorherige Umwandlung in eine Liste nicht möglich (ansonsten schlägt die Serialisierung mit einer Ausnahme fehl).