Itérateurs Python
Itérateurs Python
Un itérateur est un objet qui contient un nombre dénombrable de valeurs.
Un itérateur est un objet sur lequel on peut itérer, 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, composé des méthodes __iter__()
et __next__()
.
Itérateur vs Itérable
Les listes, tuples, dictionnaires et ensembles sont tous des objets itérables. Ce sont des conteneurs itérables à partir desquels vous pouvez obtenir un itérateur.
Tous ces objets ont une iter()
méthode qui est utilisée pour obtenir un itérateur :
Exemple
Renvoie un itérateur à partir d'un tuple et imprime chaque valeur :
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Même les chaînes sont des objets itérables et peuvent renvoyer un itérateur :
Exemple
Les chaînes sont également des objets itérables, contenant une séquence 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))
Boucler dans un itérateur
Nous pouvons également utiliser une for
boucle pour parcourir un objet itérable :
Exemple
Itérer les valeurs d'un tuple :
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
Exemple
Itérer les caractères d'une chaîne :
mystr = "banana"
for x in mystr:
print(x)
La for
boucle crée en fait un objet itérateur et exécute la méthode next() pour chaque boucle.
Créer un itérateur
Pour créer un objet/une classe en tant qu'itérateur, vous devez implémenter les méthodes
__iter__()
et
__next__()
votre objet.
Comme vous l'avez appris dans le chapitre Classes/Objets 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 __iter__()
méthode agit de la même manière, vous pouvez effectuer des opérations (initialisation, etc.), mais vous devez toujours renvoyer l'objet itérateur lui-même.
La __next__()
méthode vous permet également d'effectuer des opérations et doit renvoyer l'élément suivant dans la séquence.
Exemple
Créez un itérateur qui renvoie des nombres, en commençant par 1, et chaque séquence augmentera de un (renvoyant 1,2,3,4,5 etc.) :
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
ArrêterItération
L'exemple ci-dessus continuerait indéfiniment si vous aviez suffisamment d'instructions next() ou s'il était utilisé dans une
for
boucle.
Pour éviter que l'itération ne se poursuive indéfiniment, nous pouvons utiliser l'
StopIteration
instruction.
Dans la __next__()
méthode, nous pouvons ajouter une condition de terminaison pour générer une erreur si l'itération est effectuée un nombre de fois spécifié :
Exemple
Arrêt après 20 itérations :
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass =
MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)