Le protocole des itérateurs
Comprendre __iter__ et __next__
Le protocole des itérateurs est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce que l'itération ?
Chaque fois que vous écrivez une boucle for sur une liste, une chaîne ou un dictionnaire, Python utilise en coulisses le protocole d'itération.
Un objet sur lequel vous pouvez effectuer une boucle est appelé un itérable. L'objet qui produit effectivement les valeurs une par une est appelé un itérateur.
for ch in 'abc':
print(ch)iter() et next()
Deux fonctions intégrées pilotent l'itération :
iter(obj)demande son itérateur à un itérable.next(it)demande la valeur suivante à l'itérateur.
Lorsqu'il n'y a plus de valeurs, next() lève StopIteration.
it = iter([10, 20, 30])
print(next(it))
print(next(it))
print(next(it))StopIteration
Appeler next() une fois de trop lève StopIteration. Une boucle for intercepte automatiquement cette exception et s'arrête proprement.
it = iter([1])
print(next(it))
try:
next(it)
except StopIteration:
print('No more items')Les deux méthodes à double soulignement
Pour créer votre propre itérateur, vous devez implémenter deux méthodes :
__iter__renvoie l'objet itérateur lui-même.__next__renvoie la valeur suivante ou lèveStopIteration.
class Count:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i >= self.n:
raise StopIteration
self.i += 1
return self.i
for x in Count(3):
print(x)Itérable ou itérateur
Un itérable a seulement besoin de __iter__. Un itérateur a besoin de __iter__ et de __next__.
Les listes sont itérables, mais pas des itérateurs : chaque appel à iter() fournit un nouvel itérateur.
nums = [1, 2, 3]
print(iter(nums) is iter(nums))
it = iter(nums)
print(it is iter(it))Les itérateurs ne s'épuisent qu'une seule fois
Un itérateur ne peut être consommé qu'une seule fois. Une fois arrivé à la fin, il reste vide. Pour recommencer la boucle, créez un nouvel itérateur.
it = iter([1, 2])
print(list(it))
print(list(it))Un itérateur semblable à un compteur
Construisons un itérateur personnalisé qui se comporte comme un compteur simple. Remarquez que l'état réside dans l'instance.
class EvenUpTo:
def __init__(self, limit):
self.cur = 0
self.limit = limit
def __iter__(self):
return self
def __next__(self):
if self.cur > self.limit:
raise StopIteration
value = self.cur
self.cur += 2
return value
print(list(EvenUpTo(8)))Séparer l'itérable et l'itérateur
Une conception plus claire sépare le conteneur et l'itérateur, afin de pouvoir parcourir le conteneur plusieurs fois.
class Bag:
def __init__(self, items):
self.items = items
def __iter__(self):
return BagIterator(self.items)
class BagIterator:
def __init__(self, items):
self.items = items
self.i = 0
def __iter__(self):
return self
def __next__(self):
if self.i >= len(self.items):
raise StopIteration
v = self.items[self.i]
self.i += 1
return v
b = Bag(['x', 'y'])
print(list(b))
print(list(b))Utiliser next() avec une valeur par défaut
next(it, default) renvoie la valeur par défaut au lieu de lever StopIteration lorsque l'itérateur est vide. C'est pratique pour examiner le prochain élément en toute sécurité.
it = iter([42])
print(next(it, 'done'))
print(next(it, 'done'))Les itérateurs économisent la mémoire
Les itérateurs produisent un élément à la fois et n'ont donc pas besoin de conserver toute la séquence en mémoire. C'est pourquoi ils peuvent gérer d'immenses flux, voire des flux infinis.
class Naturals:
def __init__(self):
self.n = 0
def __iter__(self):
return self
def __next__(self):
self.n += 1
return self.n
it = iter(Naturals())
print(next(it), next(it), next(it))Fonctions intégrées qui consomment des itérateurs
De nombreuses fonctions intégrées acceptent n'importe quel itérateur : sum, max, min, sorted, list, tuple. Elles extraient les valeurs jusqu'à StopIteration.
class Count:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i >= self.n:
raise StopIteration
self.i += 1
return self.i
print(sum(Count(5)))
print(max(Count(5)))Vérification rapide
Testez votre compréhension du protocole des itérateurs.
Récapitulatif
Vous avez appris le protocole des itérateurs :
iter()obtient un itérateur ;next()extrait les valeurs.StopIterationsignale la fin, etforla gère.- Les itérateurs personnalisés implémentent
__iter__et__next__. - Les itérateurs ne s'utilisent qu'une seule fois et économisent la mémoire.
Ensuite, vous laisserez Python écrire les itérateurs à votre place avec yield.
Questions Fréquemment Posées
La leçon « Le protocole des itérateurs » est-elle gratuite ?
Oui — le texte complet de « Le protocole des itérateurs » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Le protocole des itérateurs » ?
Comprendre __iter__ et __next__ Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Python Academy ?
Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Le protocole des itérateurs » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?
Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Le protocole des itérateurs
- Fonctions génératrices
- Expressions génératrices
- yield from et délégation