Itérateurs en Python
Cet article explique les itérateurs en Python.
YouTube Video
Itérateurs en Python
Aperçu
En Python, un itérateur est un mécanisme fondamental pour traiter un à un les éléments de collections telles que les listes, les tuples et les dictionnaires.
Qu’est-ce qu’un itérateur ?
Un itérateur est un objet capable de renvoyer les éléments un par un. En Python, un objet est considéré comme un itérateur s’il remplit les deux conditions suivantes :.
- Il possède une méthode
__iter__()
qui renvoie l’objet lui-même. - Il possède une méthode
__next__()
qui renvoie l’élément suivant. Il lève l’exceptionStopIteration
lorsqu’il n’y a plus d’éléments.
1iterator = iter([1, 2, 3])
2print(next(iterator)) # 1
3print(next(iterator)) # 2
4print(next(iterator)) # 3
5# print(next(iterator)) # StopIteration occurs
- Dans ce code, la fonction
iter()
est utilisée pour convertir une liste en itérateur, et la fonctionnext()
est utilisée pour récupérer et afficher chaque élément un par un.
Différence avec un Iterable
Un itérable est un objet qui implémente la méthode __iter__()
et peut être utilisé dans une boucle for
. Les listes et les tuples sont des exemples d’itérables.
1nums = [10, 20, 30]
2it = iter(nums) # Get an iterator from the iterable
3print(next(it)) # 10
- Ce code est un exemple d'obtention d'un itérateur à partir d'un objet itérable tel qu'une liste et de récupération des éléments dans l'ordre à l'aide de
next()
.
Comment vérifier :
1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable)) # True
7print(isinstance(nums, Iterator)) # False
8print(isinstance(it, Iterator)) # True
- Ce code confirme que
nums
est un objet itérable mais pas un itérateur, tandis queit
, obtenu aveciter(nums)
, est un itérateur.
Relation entre les boucles for et les itérateurs
Une boucle for
en Python fonctionne en interne de la manière suivante :.
1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4 try:
5 value = next(iterator)
6 print(value)
7 except StopIteration:
8 break
- Comme indiqué, la boucle
for
utilise implicitement un itérateur pour effectuer l’itération.
Créer un itérateur personnalisé
Vous pouvez créer un itérateur personnalisé à l’aide d’une classe.
1class Countdown:
2 def __init__(self, start):
3 self.current = start
4
5 def __iter__(self):
6 return self
7
8 def __next__(self):
9 if self.current <= 0:
10 raise StopIteration
11 value = self.current
12 self.current -= 1
13 return value
14
15for num in Countdown(3):
16 print(num) # 3, 2, 1
- Ce code définit un itérateur personnalisé qui effectue un compte à rebours en utilisant la classe
Countdown
et affiche les nombres de 3 à 1 à l'aide d'une bouclefor
.
Différence entre itérateurs et générateurs, et quand utiliser chacun
Les générateurs fournissent une fonctionnalité similaire à celle des itérateurs. Ils permettent de définir des itérateurs de manière plus concise.
1def countdown(n):
2 while n > 0:
3 yield n
4 n -= 1
5
6for i in countdown(3):
7 print(i) # 3, 2, 1
- Ce code définit une fonction génératrice qui effectue un compte à rebours en utilisant
yield
, et affiche les nombres de 3 à 1 à l'aide d'une bouclefor
.
Différences entre itérateurs (classe) et générateurs (fonction)
Il existe les différences suivantes entre les itérateurs (classes) et les générateurs (fonctions) :.
Caractéristique | Itérateur (classe) | Générateur (fonction) |
---|---|---|
Définition | __iter__() + __next__() |
Fonction utilisant yield |
Gestion de l’état | Gestion manuelle des attributs requise | Gère automatiquement l’état |
Lisibilité | Peut devenir complexe | Simple et clair |
-
Différence dans la manière dont ils sont définis Un itérateur se définit en écrivant manuellement deux méthodes :
__iter__()
et__next__()
. En revanche, un générateur n’est qu’une simple fonction utilisant le mot-cléyield
, ce qui rend le code beaucoup plus simple. -
Différence dans la gestion de l’état Avec un itérateur, vous devez gérer manuellement l’état courant et la progression à l’aide de variables. Les générateurs, quant à eux, conservent automatiquement leur état à l’interne dans Python, ce qui réduit les efforts manuels nécessaires.
-
Lisibilité du code Les itérateurs peuvent facilement devenir complexes car ils nécessitent plusieurs méthodes et une gestion manuelle de l’état. En revanche, les générateurs utilisent une syntaxe simple, ce qui les rend plus faciles à comprendre même pour les débutants.
Bibliothèque standard pour l’utilisation des itérateurs : itertools
itertools
, une bibliothèque standard de Python, offre des outils puissants pour travailler avec les itérateurs.
1import itertools
2
3for x in itertools.count(10, 2): # 10, 12, 14, ...
4 if x > 20:
5 break
6 print(x)
- Elle inclut également de nombreuses autres fonctions telles que
cycle
,repeat
,chain
,islice
ettee
.
Cas d’utilisation des itérateurs
Les cas d'utilisation des itérateurs incluent les suivants :.
- Traitement de lignes de fichier : lire les lignes d’un fichier une à une grâce à un itérateur.
- Traitement efficace en mémoire : traiter de grandes quantités de données séquentiellement.
- Représentation de séquences infinies : utiliser des fonctions comme
itertools.count()
.
Résumé
- Un itérateur est un objet capable de récupérer la valeur suivante de manière séquentielle.
- Vous pouvez créer un itérateur personnalisé en définissant les méthodes
__iter__()
et__next__()
. - Ils sont traités automatiquement via les boucles
for
ou la fonctionnext()
. - L’utilisation de générateurs ou de
itertools
permet un traitement plus efficace.
En utilisant des itérateurs, vous pouvez traiter de grands volumes de données de manière séquentielle et efficace en mémoire, permettant une gestion contrôlée de l’état et une amélioration des performances du programme.
Vous pouvez suivre l'article ci-dessus avec Visual Studio Code sur notre chaîne YouTube. Veuillez également consulter la chaîne YouTube.