Aangepaste iterators

Gevorderde objectgeoriënteerde programmering in Python

Jake Roach

Data Engineer

Iterators

Klassen waarmee je een collectie of datastream kunt doorlopen en steeds één item teruggeven

  • Lijkt op list en tuple, maar werkt anders
  • Navigeren, transformeren, genereren
  • Te loopen met for-lussen
  • next()-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
Gevorderde objectgeoriënteerde programmering in Python

Iteratorprotocol

__iter__()

  • Geeft een iterator terug, hier een verwijzing naar zichzelf
  • ... return self

$$

__next__()

  • Geeft de volgende waarde in de collectie of datastream
  • Hier vindt iteratie, transformatie en generatie plaats

$$

Zowel __iter__() als __next__() moeten gedefinieerd zijn om een klasse een iterator te laten zijn!

Gevorderde objectgeoriënteerde programmering in Python

Voorbeelditerator

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"])
Gevorderde objectgeoriënteerde programmering in Python

Een voorbeelditerator gebruiken

three_flips = CoinFlips(3)

# Gooi de munt drie keer
next(three_flips)
next(three_flips)
next(three_flips)
H
H
T
Gevorderde objectgeoriënteerde programmering in Python

Door een iterator loopen

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
...
Gevorderde objectgeoriënteerde programmering in Python

StopIteration

...
    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
  • Signaleert einde van collectie/datastream
  • Voorkomt oneindige lussen
  • Makkelijk af te handelen
Gevorderde objectgeoriënteerde programmering in Python

Door een iterator loopen

three_flips = CoinFlips(3)

# Probeer nu door elk element van de iterator te loopen
for flip in three_flips:
    print(flip)
H
T
H
Gevorderde objectgeoriënteerde programmering in Python

StopIteration-afhandelen

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

Laten we oefenen!

Gevorderde objectgeoriënteerde programmering in Python

Preparing Video For Download...