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

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.