Itérateurs en Python

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’exception StopIteration 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 fonction next() 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 que it, obtenu avec iter(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 boucle for.

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 boucle for.

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 et tee.

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 fonction next().
  • 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.

YouTube Video