Itérateur Python

Itérateur Python

Un itérateur est un objet qui contient un nombre comptable de valeurs.

Un itérateur est un objet itérable, ce qui signifie que vous pouvez parcourir toutes les valeurs.

Techniquement, en Python, un itérateur est un objet qui implémente le protocole itérateur, contenant des méthodes __iter__() et __next__().

Itérateur VS Objet Itérable (Iterable)

Les listes, tuples, dictionnaires et ensembles sont des objets itérables. Ils sont des conteneurs itérables, à partir desquels vous pouvez obtenir des itérateurs (Iterator).

Tous ces objets ont une méthode pour obtenir des itérateurs iter() Méthode :

Exemple

Retourner un itérateur à partir d'un tuple et imprimer chaque valeur :

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))

Exécuter l'exemple

Même les chaînes de caractères sont des objets itérables et peuvent retourner des itérateurs :

Exemple

Les chaînes de caractères sont également des objets itérables, contenant une série de caractères :

mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

Exécuter l'exemple

parcourir un itérateur

Nous pouvons également utiliser une boucle for pour parcourir des objets itérables :

Exemple

itérer sur les valeurs d'un tuple :

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
  print(x)

Exécuter l'exemple

Exemple

itérer sur les caractères d'une chaîne :

mystr = "banana"
for x in mystr:
  print(x)

Exécuter l'exemple

Astuce :Le boucle for crée effectivement un objet itérateur et exécute next() méthode.

créer un itérateur

Pour créer un objet/classe en tant qu'itérateur, il est nécessaire d'implémenter __iter__() et __next__() méthode.

Comme vous avez appris dans le chapitre Classes/Objets en Python, toutes les classes ont un nom __init__() La fonction, qui vous permet d'effectuer certaines initialisations lors de la création d'un objet.

__iter__() La méthode joue un rôle similaire, vous pouvez exécuter des opérations (initialisation, etc.), mais vous devez toujours retourner l'objet itérateur lui-même.

__next__() La méthode permet également d'exécuter des opérations et doit retourner l'élément suivant de la séquence.

Exemple

Créer un itérateur qui renvoie des nombres, en commençant par 1 et augmentant de 1 à chaque séquence (retourne 1, 2, 3, 4, 5, etc.) :

class MyNumbers:
  def __iter__(self):
    self.a = 1
    retourner self
  def __next__(self):
    x = self.a
    self.a += 1
    retourner x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

Exécuter l'exemple

StopIteration

Si vous avez suffisamment de next() instruction, ou dans une boucle for, l'exemple ci-dessus se poursuivra éternellement.

Pour éviter que l'itération ne se poursuive éternellement, nous pouvons utiliser StopIteration instruction.

dans __next__() Dans une méthode, si l'itération est terminée le nombre de fois spécifié, nous pouvons ajouter une condition de terminaison pour lancer une erreur :

Exemple

S'arrêter après 20 itérations :

class MyNumbers:
  def __iter__(self):
    self.a = 1
    retourner self
  def __next__(self):
    si self.a <= 20:
      x = self.a
      self.a += 1
      retourner x
    else:
      lancer StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
  print(x)

Exécuter l'exemple