0Pricing
Python Academy · Leçon

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ève 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

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.
  • StopIteration signale la fin, et for la 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

  1. Le protocole des itérateurs
  2. Fonctions génératrices
  3. Expressions génératrices
  4. yield from et délégation
← Retour à Python Academy