In Python zijn iterators objecten die het iteratorprotocol implementeren: de methoden __iter__() en __next__(). Iterators beheren hun interne toestand en retourneren bij elke aanroep van next() het volgende element van de reeks of werpen een StopIteration uitzondering als het einde is bereikt.
Iterabele objecten zijn de objecten waarover je in een lus kunt itereren (bijvoorbeeld lijsten, strings, dictionaries). Ze hebben allemaal een __iter__() methode die een iterator retourneert.
Om een eigen iterator te implementeren, moet je een klasse maken met de methoden __iter__() (die self retourneert) en __next__() (die de logica voor het verkrijgen van het volgende element implementeert):
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
Wat zijn de verschillen tussen iterabele objecten en iterators? Kan je meer dan eens over een iterator itereren?
Antwoord: Een iterabel object implementeert alleen de __iter__() methode, die een iterator retourneert. Een iterator is een object dat een __next__() methode heeft. Een iterator wordt meestal maar één keer doorlopen: na het bereiken van het einde van de reeks is een herhaalde iteratie niet mogelijk zonder een nieuwe iterator aan te maken.
Verhaal
Op een project voor loganalyse heeft een ontwikkelaar een functie geschreven die een iterator aannam en probeerde deze twee keer door te lopen (
for log in logs:), verwachtend dat beide doorlopen dezelfde resultaten zouden opleveren. De tweede iteratie gaf niets terug, omdat de iterator al "op" was.
Verhaal
In een module retourneerde een ontwikkelaar vanuit een functie geen lijst, maar een generator, die een eenmalige iteratie mogelijk maakte. Bij het proberen om deze naar een andere functie te sturen, die een iterabel object voor meerdere doorlopen verwachtte, ontstond er een onverwachte fout en een leeg resultaat.
Verhaal
In een Web API project probeerde een ontwikkelaar een iterator rechtstreeks naar JSON te serialiseren. Iterators zijn geen lijsten, en conversie is niet mogelijk zonder ze eerst naar een lijst om te zetten (anders eindigt de serialisatie in een uitzondering).