Gevorderde objectgeoriënteerde programmering in Python
Jake Roach
Data Engineer
Klassen waarmee je een collectie of datastream kunt doorlopen en steeds één item teruggeven
list en tuple, maar werkt andersfor-lussennext()-functie$$
Iteratorprotocol...
# Collectie
chuck = NameIterator("Charles Carmicheal")
for letter in chuck:
print(letter)
C
h
u
...
# Datastream
fun_game = DiceGame(rolls=3)
next(fun_game) # ... enzovoort
4
__iter__()
... return self$$
__next__()
$$
Zowel __iter__() als __next__() moeten gedefinieerd zijn om een klasse een iterator te laten zijn!
class CoinFlips:
def __init__(self, number_of_flips):
self.number_of_flips = number_of_flips # Sla het totaal aantal worpen op
self.counter = 0
def __iter__(self):
return self # Geef een verwijzing naar de iterator terug
# Gooi de volgende munt, geef de output terug
def __next__(self):
if self.counter < self.number_of_flips:
self.counter += 1
return random.choice(["H", "T"])
three_flips = CoinFlips(3)
# Gooi de munt drie keer
next(three_flips)
next(three_flips)
next(three_flips)
H
H
T
three_flips = CoinFlips(3)
# Probeer nu door elk element van de iterator te loopen
for flip in three_flips:
print(flip)
T
H
T
None
None
None
...
...
def __next__(self):
# Doe dit alleen als de munt nog niet "number_of_flips" keer is gegooid
if self.counter < self.number_of_flips:
self.counter += 1
return random.choice(["H", "T"])
else: # Stop anders met StopIteration
raise StopIteration
three_flips = CoinFlips(3)
# Probeer nu door elk element van de iterator te loopen
for flip in three_flips:
print(flip)
H
T
H
while True:
try:
next(three_flips) # Haal het volgende element van three_flips op
# Vang een StopIteration-exceptie
except StopIteration:
print("Alle munten zijn gegooid!")
break
H
H
H
Alle munten zijn gegooid!
Gevorderde objectgeoriënteerde programmering in Python