Itérateurs en Python
Un itérateur est un objet qui contient un nombre dénombrable de valeurs. Ou autrement dit, un itérateur est un objet qui peut être itéré, ce qui signifie que vous pouvez parcourir toutes les valeurs.
En Python, un itérateur est un objet qui implémente le protocole « itérateur », qui se compose des méthodes __iter__() et __next__().
Un objet est appelé itérable si nous pouvons en obtenir un itérateur. La plupart des conteneurs intégrés en Python comme: liste, tuple, dictionnaires, etc. sont des itérables.
Tous ces objets ont une méthode iter() qui est utilisée pour obtenir un itérateur.
Itération à l’aide d’un itérateur
Nous utilisons la fonction next() pour parcourir manuellement tous les éléments d’un itérateur. Lorsque nous atteignons la fin et qu’il n’y a plus de données à renvoyer, cela déclenche l’exception StopIteration. Voici un exemple.
# définir une liste liste = ["Blue", "Red", "Green", "Orange", "Black", "Yellow"] # obtenir un itérateur en utilisant iter() myIter = iter(liste) # itérer à l'aide de l'itérateur en utilisant next() print(next(myIter)) #Cela affiche Blue print(next(myIter)) #Cela affiche Red print(next(myIter)) #Cela affiche Green print(next(myIter)) #Cela affiche Orange print(next(myIter)) #Cela affiche Black print(next(myIter)) #Cela affiche Yellow print(next(myIter)) #Cela affiche une erreur, aucun élément reste
Sortie:
Blue Red Green Orange Black Yellow Traceback (most recent call last): File "main.py", line 16, in <module> print(next(myIter)) StopIteration
Une manière plus élégante d’itérer automatiquement est d’utiliser la boucle for. En utilisant cela, nous pouvons itérer sur n’importe quel objet qui peut retourner un itérateur, par exemple une liste, un tuple, une chaîne, etc.
# définir une liste liste = ["Blue", "Red", "Green", "Orange", "Black", "Yellow"] for i in liste: print(i)
Sortie:
Blue Red Green Orange Black Yellow
La boucle for crée en fait un objet itérateur et exécute la méthode next() pour chaque itération.
Créer un itérateur
Pour créer un objet/classe en tant qu’itérateur, vous devez implémenter les méthodes __iter__() et __next__() à votre objet.
Comme vous l’avez vu dans le chapitre Classes et Objets en Python, toutes les classes ont une fonction appelée __init__(), qui vous permet d’effectuer une initialisation lors de la création de l’objet.
La méthode __iter__() agit de manière similaire, vous pouvez effectuer des opérations (initialisation, etc.), mais vous devez toujours renvoyer l’objet itérateur lui-même.
La méthode __next__() vous permet également d’effectuer des opérations et doit renvoyer l’élément suivant de la séquence.
Exemple:
#crée la classe en implémentant les méthode __iter__() et __next__() class Counter: def __iter__(self): self.n = 1 return self def __next__(self): i = self.n self.n += 1 return i #crée un objet de la classe Counter counter = Counter() #récupérer l'itérateur my_iter = iter(counter) # itérer à l'aide de l'itérateur en utilisant next() print(next(my_iter)) print(next(my_iter)) print(next(my_iter)) print(next(my_iter))
Sortie:
1 2 3 4
StopIteration
L’exemple ci-dessus continuerait indéfiniment si vous aviez suffisamment d’instructions next() ou s’il était utilisé dans une boucle for.
Pour empêcher l’itération de continuer indéfiniment, nous pouvons utiliser l’instruction StopIteration.
Dans la méthode __next__(), nous pouvons ajouter une condition de fin pour générer une erreur si l’itération est effectuée un nombre spécifié de fois:
Exemple:
Arrêtez après 5 itérations:
#crée la classe en implémentant les méthode __iter__() et __next__() class Counter: def __iter__(self): self.n = 1 return self def __next__(self): if self.n <= 5: i = self.n self.n += 1 return i else: raise StopIteration #crée un objet de la classe Counter counter = Counter() #récupérer l'itérateur my_iter = iter(counter) # itérer à l'aide de l'itérateur en utilisant next() print(next(my_iter)) print(next(my_iter)) print(next(my_iter)) print(next(my_iter)) print(next(my_iter)) print(next(my_iter))
Sortie:
1 2 3 4 5 Traceback (most recent call last): File "main.py", line 26, in <module> print(next(my_iter)) File "main.py", line 14, in __next__ raise StopIteration StopIteration