Itérateurs personnalisés

Programmation orientée objet intermédiaire en Python

Jake Roach

Data Engineer

Itérateurs

Classes qui permettent de parcourir un ensemble d'objets ou un flux de données et retournent un élément à la fois

  • Similaires aux list, tuple, mais se comportent autrement
  • Parcourir, transformer, générer
  • Parcourus avec des boucles for
  • Fonction next()

$$

Protocole d'itérateur…

# Collection
chuck = NameIterator("Charles Carmicheal")
for letter in chuck:
    print(letter)
C
h
u
...
# Flux de données
fun_game = DiceGame(rolls=3)
next(fun_game)  # ... et ainsi de suite
4
Programmation orientée objet intermédiaire en Python

Protocole d'itérateur

__iter__()

  • Retourne un itérateur, ici une référence à lui-même
  • ... return self

$$

__next__()

  • Retourne la prochaine valeur de la collection ou du flux
  • L'itération, la transformation et la génération s'y effectuent

$$

__iter__() et __next__() doivent être définies pour qu'une classe soit un itérateur !

Programmation orientée objet intermédiaire en Python

Exemple d'itérateur

class CoinFlips:
    def __init__(self, number_of_flips):
        self.number_of_flips = number_of_flips  # Conserver le nombre total de lancers
        self.counter = 0

    def __iter__(self):
        return self  # Retourner une référence de l'itérateur

    # Lancer la prochaine pièce et retourner le résultat
    def __next__(self):
        if self.counter < self.number_of_flips:
            self.counter += 1
            return random.choice(["H", "T"])
Programmation orientée objet intermédiaire en Python

Utiliser un itérateur d'exemple

three_flips = CoinFlips(3)

# Lancer la pièce trois fois
next(three_flips)
next(three_flips)
next(three_flips)
H
H
T
Programmation orientée objet intermédiaire en Python

Parcourir un itérateur

three_flips = CoinFlips(3)

# Maintenant, essayez de parcourir chaque élément de l'itérateur
for flip in three_flips:
    print(flip)
T
H
T
None
None
None
...
Programmation orientée objet intermédiaire en Python

StopIteration

...
    def __next__(self):
        # Faire ceci seulement si la pièce n'a pas été lancée "number_of_flips" fois
        if self.counter < self.number_of_flips:
            self.counter += 1
            return random.choice(["H", "T"])

        else:  # Sinon, arrêter avec StopIteration
            raise StopIteration
  • Signale la fin des collections/du flux de données
  • Empêche les boucles infinies
  • Simple à gérer
Programmation orientée objet intermédiaire en Python

Parcourir un itérateur

three_flips = CoinFlips(3)

# Maintenant, essayez de parcourir chaque élément de l'itérateur
for flip in three_flips:
    print(flip)
H
T
H
Programmation orientée objet intermédiaire en Python

Gérer les exceptions StopIteration

while True:
    try:
        next(three_flips)  # Obtenir le prochain élément de three_flips

    # Intercepter l'exception StopIteration
    except StopIteration:
        print("Tous les lancers sont terminés !")
        break
H
H
H
Tous les lancers sont terminés !
Programmation orientée objet intermédiaire en Python

Passons à la pratique !

Programmation orientée objet intermédiaire en Python

Preparing Video For Download...