Implémentation d'itérateurs personnalisés
Le protocole d'itérateur
Comme mentionné précédemment, le protocole d'itérateur en Python définit deux méthodes : __iter__()
et __next__()
. Pour créer un itérateur personnalisé, vous devez implémenter ces deux méthodes dans votre propre classe.
Implémentation de la méthode __iter__()
La méthode __iter__()
devrait renvoyer l'objet itérateur lui-même. Cette méthode est appelée lorsque vous utilisez la fonction iter()
ou lorsque vous utilisez l'objet dans une boucle for
.
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
Implémentation de la méthode __next__()
La méthode __next__()
devrait renvoyer l'élément suivant dans la séquence. S'il n'y a plus d'éléments, elle devrait lever une exception StopIteration
.
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration()
Utilisation de l'itérateur personnalisé
Une fois que vous avez implémenté le protocole d'itérateur, vous pouvez utiliser votre itérateur personnalisé dans une boucle for
ou avec d'autres mécanismes d'itération.
my_iterator = MyIterator([1, 2, 3, 4, 5])
for item in my_iterator:
print(item)
Sortie :
1
2
3
4
5
Evaluation paresseuse avec les générateurs
Les générateurs sont un type spécial de fonction qui peut être utilisé pour créer des itérateurs personnalisés. Les générateurs utilisent le mot-clé yield
pour renvoyer des valeurs une par une, plutôt que de construire une liste complète en mémoire.
def my_generator(n):
i = 0
while i < n:
yield i
i += 1
my_gen = my_generator(5)
for item in my_gen:
print(item)
Sortie :
0
1
2
3
4
Les générateurs peuvent être plus efficaces en mémoire que la création d'une liste complète, en particulier lorsqu'il s'agit de travailler avec des ensembles de données volumineux ou infinis.