Python -iterators
Python-iterators
Een iterator is een object dat een telbaar aantal waarden bevat.
Een iterator is een object waarop kan worden herhaald, wat betekent dat u door alle waarden kunt lopen.
Technisch gezien is een iterator in Python een object dat het iteratorprotocol implementeert, dat bestaat uit de methoden __iter__()
en __next__()
.
Iterator versus itereerbaar
Lijsten, tupels, woordenboeken en sets zijn allemaal itereerbare objecten. Het zijn itereerbare containers waar je een iterator uit kunt halen.
Al deze objecten hebben een iter()
methode die wordt gebruikt om een iterator te krijgen:
Voorbeeld
Retourneer een iterator van een tuple en druk elke waarde af:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Even strings zijn itereerbare objecten en kunnen een iterator retourneren:
Voorbeeld
Strings zijn ook itereerbare objecten, die een reeks tekens bevatten:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
Een iterator doorlopen
We kunnen ook een for
lus gebruiken om door een itereerbaar object te itereren:
Voorbeeld
Herhaal de waarden van een tuple:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
Voorbeeld
Herhaal de karakters van een string:
mystr = "banana"
for x in mystr:
print(x)
De for
lus maakt in feite een iterator-object en voert voor elke lus de methode next() uit.
Maak een iterator
Om een object/klasse als iterator te maken, moet je de methoden
__iter__()
en
__next__()
op je object implementeren.
Zoals je hebt geleerd in het hoofdstuk Python-klassen/objecten , hebben alle klassen een functie genaamd
__init__()
, waarmee je wat kunt initialiseren wanneer het object wordt gemaakt.
De __iter__()
methode werkt vergelijkbaar, u kunt bewerkingen uitvoeren (initialiseren enz.), maar moet altijd het iterator-object zelf retourneren.
Met de __next__()
methode kunt u ook bewerkingen uitvoeren en moet u het volgende item in de reeks retourneren.
Voorbeeld
Maak een iterator die getallen retourneert, beginnend met 1, en elke reeks wordt met één verhoogd (retourneert 1,2,3,4,5 enz.):
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))
StopIteratie
Het bovenstaande voorbeeld zou voor altijd doorgaan als je genoeg next()-instructies had, of als het in een
for
lus werd gebruikt.
Om te voorkomen dat de iteratie voor altijd doorgaat, kunnen we de
StopIteration
instructie gebruiken.
In de __next__()
methode kunnen we een beëindigingsvoorwaarde toevoegen om een fout te veroorzaken als de iteratie een bepaald aantal keren wordt uitgevoerd:
Voorbeeld
Stop na 20 iteraties:
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)