En Python, les itérateurs sont des objets qui implémentent le protocole de l'itérateur : les méthodes __iter__() et __next__(). Les itérateurs gèrent leur état interne et à chaque appel de next(), ils retournent le prochain élément de la séquence ou lèvent une exception StopIteration à la fin.
Les objets itérables sont ceux sur lesquels on peut itérer dans une boucle (par exemple, les listes, les chaînes de caractères, les dictionnaires). Tous ces objets ont une méthode __iter__() qui retourne un itérateur.
Pour implémenter un itérateur personnalisé, il faut créer une classe avec les méthodes __iter__() (retourne self) et __next__() (implémente la logique d'obtention du prochain élément) :
class Counter: def __init__(self, low, high): self.current = low self.high = high def __iter__(self): return self def __next__(self): if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1 for num in Counter(1, 3): print(num) # 1 2 3
Quelle est la différence entre les objets itérables et les itérateurs ? Peut-on itérer sur un itérateur plus d'une fois ?
Réponse : Un objet itérable implémente uniquement la méthode __iter__(), qui retourne un itérateur. Un itérateur est un objet qui a une méthode __next__(). Un itérateur s'itère généralement une seule fois : après avoir atteint la fin de la séquence, une itération répétée n'est pas possible sans créer un nouvel itérateur.
Histoire
Dans un projet d'analyse de journaux, un développeur a écrit une fonction qui prenait un itérateur et essayait de le parcourir deux fois (
for log in logs:), s'attendant à ce que les deux passées donnent les mêmes résultats. La deuxième itération ne retournait rien, car l'itérateur était déjà "épuisé".
Histoire
Dans un module, un développeur a retourné d'une fonction non pas une liste, mais un générateur, permettant une itération unique. En essayant de le passer à une autre fonction qui s'attendait à un objet itérable pour plusieurs passages, une erreur inattendue et un résultat vide sont survenus.
Histoire
Dans un projet d'API Web, un développeur a essayé de sérialiser directement un itérateur en JSON. Les itérateurs ne sont pas des listes, et la conversion est impossible sans d'abord les convertir en liste (sinon la sérialisation échouera avec une exception).