Comment utiliser next pour obtenir l'élément suivant d'un itérateur Python

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce tutoriel, vous apprendrez à utiliser la fonction next() pour accéder aux éléments des itérateurs Python. Les itérateurs sont des objets fondamentaux en Python qui vous permettent de traiter des collections de données un élément à la fois. En maîtrisant la fonction next(), vous pourrez écrire un code plus efficace et avoir un meilleur contrôle sur le traitement de vos données.

Tout au long de ce tutoriel, vous créerez et manipulerez des itérateurs, gérerez les exceptions liées aux itérateurs et explorerez les applications pratiques des itérateurs dans des scénarios de programmation réels.

Création et utilisation d'itérateurs de base

En Python, un itérateur est un objet qui vous permet de parcourir une collection d'éléments un par un. Commençons par comprendre comment créer et utiliser des itérateurs de base.

Création d'un itérateur à partir d'une liste

Tout d'abord, ouvrons l'éditeur VSCode et créons un nouveau fichier Python :

  1. Dans le panneau de l'explorateur (à gauche), cliquez sur le dossier du projet.
  2. Cliquez avec le bouton droit et sélectionnez "Nouveau fichier".
  3. Nommez le fichier basic_iterator.py.

Maintenant, ajoutez le code suivant à basic_iterator.py :

## Create a simple list
fruits = ["apple", "banana", "cherry", "date", "elderberry"]

## Convert the list to an iterator
fruits_iterator = iter(fruits)

## Print the type of the iterator
print("Type of fruits_iterator:", type(fruits_iterator))

## Use next() to get the first element
first_fruit = next(fruits_iterator)
print("First fruit:", first_fruit)

## Get the second element
second_fruit = next(fruits_iterator)
print("Second fruit:", second_fruit)

## Get the third element
third_fruit = next(fruits_iterator)
print("Third fruit:", third_fruit)

Exécution de votre code

Pour exécuter votre code, ouvrez un terminal dans le WebIDE :

  1. Cliquez sur "Terminal" dans le menu supérieur.
  2. Sélectionnez "Nouveau terminal".
  3. Dans le terminal, exécutez :
python3 ~/project/basic_iterator.py

Vous devriez voir une sortie similaire à :

Type of fruits_iterator: <class 'list_iterator'>
First fruit: apple
Second fruit: banana
Third fruit: cherry

Comprendre ce qui s'est passé

Décortiquons ce que nous avons fait :

  1. Nous avons créé une liste appelée fruits avec cinq éléments.
  2. Nous avons converti la liste en un itérateur en utilisant la fonction iter().
  3. Nous avons imprimé le type de l'itérateur, montrant qu'il s'agit d'un objet list_iterator.
  4. Nous avons utilisé la fonction next() trois fois pour récupérer les trois premiers éléments de l'itérateur.

Chaque fois que vous appelez next(), l'itérateur avance vers l'élément suivant de la collection et le renvoie. L'itérateur garde une trace de sa position, il se souvient donc où il s'est arrêté entre les appels.

Essayez par vous-même

Maintenant, modifiez le code pour récupérer les éléments restants de l'itérateur. Ajoutez ces lignes à la fin de votre fichier :

## Get the fourth element
fourth_fruit = next(fruits_iterator)
print("Fourth fruit:", fourth_fruit)

## Get the fifth element
fifth_fruit = next(fruits_iterator)
print("Fifth fruit:", fifth_fruit)

Enregistrez le fichier et exécutez-le à nouveau :

python3 ~/project/basic_iterator.py

Vous devriez maintenant voir les cinq fruits affichés dans la console.

Concepts clés

  • Un itérable est tout objet sur lequel on peut effectuer une boucle (comme les listes, les tuples, les chaînes de caractères).
  • Un itérateur est un objet qui implémente le protocole d'itération avec les méthodes __iter__() et __next__().
  • La fonction iter() convertit un itérable en un itérateur.
  • La fonction next() récupère l'élément suivant d'un itérateur.

Gestion de l'exception StopIteration et utilisation de valeurs par défaut

Lorsque vous utilisez des itérateurs en Python, vous devez être conscient de ce qui se passe lorsque vous atteignez la fin de l'itérateur. Explorons comment gérer cette situation.

Qu'arrive-t-il à la fin d'un itérateur ?

Créez un nouveau fichier nommé stop_iteration.py dans votre dossier de projet :

  1. Dans le panneau de l'explorateur, cliquez avec le bouton droit sur le dossier du projet.
  2. Sélectionnez "Nouveau fichier".
  3. Nommez le fichier stop_iteration.py.

Ajoutez le code suivant :

## Create a small list
numbers = [1, 2, 3]

## Convert the list to an iterator
numbers_iterator = iter(numbers)

## Retrieve all elements and one more
print(next(numbers_iterator))  ## 1
print(next(numbers_iterator))  ## 2
print(next(numbers_iterator))  ## 3
print(next(numbers_iterator))  ## What happens here?

Exécutez le code dans votre terminal :

python3 ~/project/stop_iteration.py

Vous verrez un message d'erreur comme celui-ci :

1
2
3
Traceback (most recent call last):
  File "/home/labex/project/stop_iteration.py", line 10, in <module>
    print(next(numbers_iterator))  ## What happens here?
StopIteration

Lorsque nous atteignons la fin d'un itérateur et que nous essayons d'obtenir l'élément suivant, Python lève une exception StopIteration. C'est la manière standard de signaler qu'il n'y a plus d'éléments à récupérer.

Gestion de l'exception StopIteration avec un bloc try-except

Modifions notre code pour gérer l'exception StopIteration en utilisant un bloc try-except. Mettez à jour stop_iteration.py avec ce code :

## Create a small list
numbers = [1, 2, 3]

## Convert the list to an iterator
numbers_iterator = iter(numbers)

## Try to retrieve elements safely
try:
    print(next(numbers_iterator))  ## 1
    print(next(numbers_iterator))  ## 2
    print(next(numbers_iterator))  ## 3
    print(next(numbers_iterator))  ## Will raise StopIteration
except StopIteration:
    print("End of iterator reached!")

print("Program continues after exception handling")

Exécutez le code mis à jour :

python3 ~/project/stop_iteration.py

Maintenant, vous verrez :

1
2
3
End of iterator reached!
Program continues after exception handling

Le bloc try-except intercepte l'exception StopIteration, permettant à votre programme de continuer à s'exécuter sans problème.

Utilisation du paramètre par défaut dans next()

Python propose une manière plus élégante de gérer la fin d'un itérateur. La fonction next() accepte un deuxième paramètre facultatif qui spécifie une valeur par défaut à retourner lorsque l'itérateur est épuisé.

Créez un nouveau fichier nommé next_default.py :

## Create a small list
numbers = [1, 2, 3]

## Convert the list to an iterator
numbers_iterator = iter(numbers)

## Use default value with next()
print(next(numbers_iterator, "End reached"))  ## 1
print(next(numbers_iterator, "End reached"))  ## 2
print(next(numbers_iterator, "End reached"))  ## 3
print(next(numbers_iterator, "End reached"))  ## Will return the default value
print(next(numbers_iterator, "End reached"))  ## Will return the default value again

Exécutez le code :

python3 ~/project/next_default.py

Vous verrez :

1
2
3
End reached
End reached

Au lieu de lever une exception, next() retourne la valeur par défaut "End reached" lorsqu'il n'y a plus d'éléments.

Exemple pratique : Parcours d'un itérateur avec une boucle

Créons un exemple plus pratique où nous utilisons une boucle while avec next() pour traiter les éléments d'un itérateur. Créez un fichier nommé iterator_loop.py :

## Create a list of temperatures (in Celsius)
temperatures_celsius = [22, 28, 19, 32, 25, 17]

## Create an iterator
temp_iterator = iter(temperatures_celsius)

## Convert Celsius to Fahrenheit using the iterator
print("Temperature Conversion (Celsius to Fahrenheit):")
print("-" * 45)
print("Celsius\tFahrenheit")
print("-" * 45)

## Loop through the iterator with next() and default value
while True:
    celsius = next(temp_iterator, None)
    if celsius is None:
        break

    ## Convert to Fahrenheit: (C × 9/5) + 32
    fahrenheit = (celsius * 9/5) + 32
    print(f"{celsius}°C\t{fahrenheit:.1f}°F")

print("-" * 45)
print("Conversion complete!")

Exécutez le code :

python3 ~/project/iterator_loop.py

Vous verrez :

Temperature Conversion (Celsius to Fahrenheit):
---------------------------------------------
Celsius	Fahrenheit
---------------------------------------------
22°C	71.6°F
28°C	82.4°F
19°C	66.2°F
32°C	89.6°F
25°C	77.0°F
17°C	62.6°F
---------------------------------------------
Conversion complete!

Cet exemple montre comment utiliser next() avec une valeur par défaut pour parcourir un itérateur de manière contrôlée. Lorsque l'itérateur est épuisé, next() retourne None, et nous sortons de la boucle.

Création d'itérateurs personnalisés

Maintenant que vous savez comment utiliser la fonction intégrée next() avec des itérables existants, apprenons à créer votre propre itérateur personnalisé.

Comprendre le protocole d'itération

Pour créer un itérateur personnalisé, vous devez implémenter deux méthodes spéciales :

  1. __iter__() : Retourne l'objet itérateur lui-même.
  2. __next__() : Retourne l'élément suivant de la séquence ou lève une exception StopIteration lorsqu'il n'y a plus d'éléments.

Créons un simple itérateur personnalisé qui compte jusqu'à un nombre spécifié. Créez un nouveau fichier nommé custom_iterator.py :

class CountUpIterator:
    """A simple iterator that counts up from 1 to a specified limit."""

    def __init__(self, limit):
        """Initialize the iterator with a limit."""
        self.limit = limit
        self.current = 0

    def __iter__(self):
        """Return the iterator object itself."""
        return self

    def __next__(self):
        """Return the next value in the sequence."""
        self.current += 1
        if self.current <= self.limit:
            return self.current
        else:
            ## No more items
            raise StopIteration

## Create an instance of our custom iterator
counter = CountUpIterator(5)

## Use the next() function with our iterator
print("Counting up:")
print(next(counter))  ## 1
print(next(counter))  ## 2
print(next(counter))  ## 3
print(next(counter))  ## 4
print(next(counter))  ## 5

## This will raise StopIteration
try:
    print(next(counter))
except StopIteration:
    print("Reached the end of the counter!")

## We can also use it in a for loop
print("\nUsing the iterator in a for loop:")
for num in CountUpIterator(3):
    print(num)

Exécutez le code :

python3 ~/project/custom_iterator.py

Vous verrez :

Counting up:
1
2
3
4
5
Reached the end of the counter!

Using the iterator in a for loop:
1
2
3

Fonctionnement de l'itérateur personnalisé

Comprenons ce qui se passe :

  1. La classe CountUpIterator implémente le protocole d'itération avec les méthodes __iter__() et __next__().
  2. Lorsque vous appelez next(counter), Python appelle la méthode __next__() de votre itérateur.
  3. Chaque appel à __next__() incrémente le compteur et retourne la nouvelle valeur.
  4. Lorsque le compteur dépasse la limite, il lève une exception StopIteration.
  5. Les boucles for gèrent automatiquement l'exception StopIteration, c'est pourquoi nous pouvons utiliser notre itérateur directement dans une boucle for.

Création d'un itérateur plus utile : la suite de Fibonacci

Créons un itérateur plus intéressant qui génère la suite de Fibonacci jusqu'à une limite. Créez un fichier nommé fibonacci_iterator.py :

class FibonacciIterator:
    """Iterator that generates Fibonacci numbers up to a specified limit."""

    def __init__(self, max_value):
        """Initialize with a maximum value."""
        self.max_value = max_value
        self.a, self.b = 0, 1
        self.count = 0

    def __iter__(self):
        """Return the iterator object itself."""
        return self

    def __next__(self):
        """Return the next Fibonacci number."""
        ## First number in sequence
        if self.count == 0:
            self.count += 1
            return self.a

        ## Second number in sequence
        if self.count == 1:
            self.count += 1
            return self.b

        ## Generate the next Fibonacci number
        next_value = self.a + self.b

        ## Stop if we exceed the maximum value
        if next_value > self.max_value:
            raise StopIteration

        ## Update the values for the next iteration
        self.a, self.b = self.b, next_value
        self.count += 1

        return next_value

## Create a Fibonacci iterator that generates numbers up to 100
fib = FibonacciIterator(100)

## Print the Fibonacci sequence
print("Fibonacci sequence up to 100:")
while True:
    try:
        number = next(fib)
        print(number, end=" ")
    except StopIteration:
        break

print("\n\nUsing the same iterator in a for loop:")
## Note: we need to create a new iterator since the previous one is exhausted
for num in FibonacciIterator(100):
    print(num, end=" ")
print()

Exécutez le code :

python3 ~/project/fibonacci_iterator.py

Vous verrez :

Fibonacci sequence up to 100:
0 1 1 2 3 5 8 13 21 34 55 89

Using the same iterator in a for loop:
0 1 1 2 3 5 8 13 21 34 55 89

Exercice pratique : Création d'un itérateur de lignes de fichier

Créons un itérateur pratique qui lit les lignes d'un fichier une par une, ce qui peut être utile lorsqu'on travaille avec de gros fichiers. Tout d'abord, créons un fichier texte d'exemple :

  1. Créez un nouveau fichier nommé sample.txt :
This is line 1 of our sample file.
Python iterators are powerful tools.
They allow you to process data one item at a time.
This is efficient for large datasets.
The end!
  1. Maintenant, créez un fichier nommé file_iterator.py :
class FileLineIterator:
    """Iterator that reads lines from a file one at a time."""

    def __init__(self, filename):
        """Initialize with a filename."""
        self.filename = filename
        self.file = None

    def __iter__(self):
        """Open the file and return the iterator."""
        self.file = open(self.filename, 'r')
        return self

    def __next__(self):
        """Read the next line from the file."""
        if self.file is None:
            raise StopIteration

        line = self.file.readline()

        if not line:  ## Empty string indicates end of file
            self.file.close()
            self.file = None
            raise StopIteration

        return line.strip()  ## Remove trailing newline

    def __del__(self):
        """Ensure the file is closed when the iterator is garbage collected."""
        if self.file is not None:
            self.file.close()

## Create a file iterator
line_iterator = FileLineIterator('/home/labex/project/sample.txt')

## Read lines one by one
print("Reading file line by line:")
print("-" * 30)

try:
    line_number = 1
    while True:
        line = next(line_iterator)
        print(f"Line {line_number}: {line}")
        line_number += 1
except StopIteration:
    print("-" * 30)
    print("End of file reached!")

## Read the file again using a for loop
print("\nReading file with for loop:")
print("-" * 30)
for i, line in enumerate(FileLineIterator('/home/labex/project/sample.txt'), 1):
    print(f"Line {i}: {line}")
print("-" * 30)

Exécutez le code :

python3 ~/project/file_iterator.py

Vous verrez :

Reading file line by line:
------------------------------
Line 1: This is line 1 of our sample file.
Line 2: Python iterators are powerful tools.
Line 3: They allow you to process data one item at a time.
Line 4: This is efficient for large datasets.
Line 5: The end!
------------------------------
End of file reached!

Reading file with for loop:
------------------------------
Line 1: This is line 1 of our sample file.
Line 2: Python iterators are powerful tools.
Line 3: They allow you to process data one item at a time.
Line 4: This is efficient for large datasets.
Line 5: The end!
------------------------------

Cet itérateur de lignes de fichier illustre une utilisation pratique des itérateurs. Il vous permet de traiter un fichier ligne par ligne sans charger tout le fichier en mémoire, ce qui est particulièrement utile pour les gros fichiers.

Applications pratiques des itérateurs

Maintenant que vous savez créer et utiliser des itérateurs, explorons quelques applications pratiques du monde réel où les itérateurs peuvent améliorer votre code.

Évaluation paresseuse avec les générateurs

Les générateurs sont un type spécial d'itérateur créés avec des fonctions utilisant l'instruction yield. Ils vous permettent de générer des valeurs à la volée, ce qui peut être plus économiquement en mémoire que de créer une liste complète.

Créez un fichier nommé generator_example.py :

def squared_numbers(n):
    """Generate squares of numbers from 1 to n."""
    for i in range(1, n + 1):
        yield i * i

## Create a generator for squares of numbers 1 to 10
squares = squared_numbers(10)

## squares is a generator object (a type of iterator)
print(f"Type of squares: {type(squares)}")

## Use next() to get values from the generator
print("\nGetting values with next():")
print(next(squares))  ## 1
print(next(squares))  ## 4
print(next(squares))  ## 9

## Use a for loop to get the remaining values
print("\nGetting remaining values with a for loop:")
for square in squares:
    print(square)

## The generator is now exhausted, so this won't print anything
print("\nTrying to get more values (generator is exhausted):")
for square in squares:
    print(square)

## Create a new generator and convert all values to a list at once
all_squares = list(squared_numbers(10))
print(f"\nAll squares as a list: {all_squares}")

Exécutez le code :

python3 ~/project/generator_example.py

Vous verrez :

Type of squares: <class 'generator'>

Getting values with next():
1
4
9

Getting remaining values with a for loop:
16
25
36
49
64
81
100

Trying to get more values (generator is exhausted):

All squares as a list: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Les générateurs sont un moyen plus concis de créer des itérateurs pour les cas simples. Ils implémentent automatiquement le protocole d'itération pour vous.

Traitement de grands ensembles de données

Les itérateurs sont parfaits pour traiter de grands ensembles de données car ils vous permettent de travailler avec un élément à la fois. Créons un exemple qui simule le traitement d'un grand ensemble de données de températures :

Créez un fichier nommé data_processing.py :

import random
import time

def temperature_data_generator(days, start_temp=15.0, max_variation=5.0):
    """Generate simulated hourly temperature data for a number of days."""
    hours_per_day = 24
    total_hours = days * hours_per_day

    current_temp = start_temp

    for hour in range(total_hours):
        ## Simulate temperature variations
        day_progress = (hour % hours_per_day) / hours_per_day  ## 0.0 to 1.0 through the day

        ## Temperature is generally cooler at night, warmer during day
        time_factor = -max_variation/2 * (
            -2 * day_progress + 1 if day_progress < 0.5
            else 2 * day_progress - 1
        )

        ## Add some randomness
        random_factor = random.uniform(-1.0, 1.0)

        current_temp += time_factor + random_factor
        current_temp = max(0, min(40, current_temp))  ## Keep between 0-40°C

        yield (hour // hours_per_day, hour % hours_per_day, round(current_temp, 1))

def process_temperature_data():
    """Process a large set of temperature data using an iterator."""
    print("Processing hourly temperature data for 30 days...")
    print("-" * 50)

    ## Create our data generator
    data_iterator = temperature_data_generator(days=30)

    ## Track some statistics
    total_readings = 0
    temp_sum = 0
    min_temp = float('inf')
    max_temp = float('-inf')

    ## Process the data one reading at a time
    start_time = time.time()

    for day, hour, temp in data_iterator:
        ## Update statistics
        total_readings += 1
        temp_sum += temp
        min_temp = min(min_temp, temp)
        max_temp = max(max_temp, temp)

        ## Just for demonstration, print a reading every 24 hours
        if hour == 12:  ## Noon each day
            print(f"Day {day+1}, 12:00 PM: {temp}°C")

    processing_time = time.time() - start_time

    ## Calculate final statistics
    avg_temp = temp_sum / total_readings if total_readings > 0 else 0

    print("-" * 50)
    print(f"Processed {total_readings} temperature readings in {processing_time:.3f} seconds")
    print(f"Average temperature: {avg_temp:.1f}°C")
    print(f"Temperature range: {min_temp:.1f}°C to {max_temp:.1f}°C")

## Run the temperature data processing
process_temperature_data()

Exécutez le code :

python3 ~/project/data_processing.py

Vous verrez une sortie similaire à (les températures exactes varieront en raison de la génération aléatoire) :

Processing hourly temperature data for 30 days...
--------------------------------------------------
Day 1, 12:00 PM: 17.5°C
Day 2, 12:00 PM: 18.1°C
Day 3, 12:00 PM: 17.3°C
...
Day 30, 12:00 PM: 19.7°C
--------------------------------------------------
Processed 720 temperature readings in 0.012 seconds
Average temperature: 18.2°C
Temperature range: 12.3°C to 24.7°C

Dans cet exemple, nous utilisons un itérateur pour traiter un ensemble de données simulé de 720 mesures de température (24 heures × 30 jours) sans avoir à stocker toutes les données en mémoire à la fois. L'itérateur génère chaque mesure à la demande, rendant le code plus économiquement en mémoire.

Construction d'un pipeline de données avec des itérateurs

Les itérateurs peuvent être enchaînés pour créer des pipelines de traitement de données. Construisons un simple pipeline qui :

  1. Génère des nombres
  2. Filtre les nombres impairs
  3. Eleve au carré les nombres pairs restants
  4. Limite la sortie à un nombre spécifique de résultats

Créez un fichier nommé data_pipeline.py :

def generate_numbers(start, end):
    """Generate numbers in the given range."""
    print(f"Starting generator from {start} to {end}")
    for i in range(start, end + 1):
        print(f"Generating: {i}")
        yield i

def filter_even(numbers):
    """Filter for even numbers only."""
    for num in numbers:
        if num % 2 == 0:
            print(f"Filtering: {num} is even")
            yield num
        else:
            print(f"Filtering: {num} is odd (skipped)")

def square_numbers(numbers):
    """Square each number."""
    for num in numbers:
        squared = num ** 2
        print(f"Squaring: {num} → {squared}")
        yield squared

def limit_results(iterable, max_results):
    """Limit the number of results."""
    count = 0
    for item in iterable:
        if count < max_results:
            print(f"Limiting: keeping item #{count+1}")
            yield item
            count += 1
        else:
            print(f"Limiting: reached maximum of {max_results} items")
            break

## Create our data pipeline
print("Creating data pipeline...\n")

pipeline = (
    limit_results(
        square_numbers(
            filter_even(
                generate_numbers(1, 10)
            )
        ),
        3  ## Limit to 3 results
    )
)

## Execute the pipeline by iterating through it
print("\nExecuting pipeline and collecting results:")
print("-" * 50)
results = list(pipeline)
print("-" * 50)

print(f"\nFinal results: {results}")

Exécutez le code :

python3 ~/project/data_pipeline.py

Vous verrez :

Creating data pipeline...

Executing pipeline and collecting results:
--------------------------------------------------
Starting generator from 1 to 10
Generating: 1
Filtering: 1 is odd (skipped)
Generating: 2
Filtering: 2 is even
Squaring: 2 → 4
Limiting: keeping item #1
Generating: 3
Filtering: 3 is odd (skipped)
Generating: 4
Filtering: 4 is even
Squaring: 4 → 16
Limiting: keeping item #2
Generating: 5
Filtering: 5 is odd (skipped)
Generating: 6
Filtering: 6 is even
Squaring: 6 → 36
Limiting: keeping item #3
Generating: 7
Filtering: 7 is odd (skipped)
Generating: 8
Filtering: 8 is even
Squaring: 8 → 64
Limiting: reached maximum of 3 items
--------------------------------------------------

Final results: [4, 16, 36]

Cet exemple de pipeline montre comment les itérateurs peuvent être connectés pour former un flux de traitement de données. Chaque étape du pipeline traite un élément à la fois, le passant à l'étape suivante. Le pipeline ne traite aucune donnée tant que nous n'utilisons pas réellement les résultats (dans ce cas, en les convertissant en une liste).

Le principal avantage est qu'aucune liste intermédiaire n'est créée entre les étapes du pipeline, ce qui rend cette approche économiquement en mémoire même pour de grands ensembles de données.

Résumé

Dans ce tutoriel, vous avez appris à utiliser efficacement les itérateurs Python et la fonction next(). Les concepts clés abordés sont les suivants :

  1. Itérateurs de base : Création d'itérateurs à partir de collections existantes et utilisation de next() pour récupérer les éléments un par un.

  2. Gestion des exceptions : Gestion de l'exception StopIteration qui se produit lorsqu'un itérateur est épuisé, et utilisation de valeurs par défaut avec next() pour fournir des valeurs de secours.

  3. Itérateurs personnalisés : Création de vos propres classes d'itérateurs en implémentant les méthodes __iter__() et __next__(), vous permettant de générer des séquences de données personnalisées.

  4. Applications pratiques : Utilisation des itérateurs pour un traitement de données efficace, l'évaluation paresseuse avec les générateurs et la construction de pipelines de traitement de données.

Ces techniques d'itération sont fondamentales pour écrire un code Python économiquement en mémoire et évolutif, en particulier lorsque vous travaillez avec de grands ensembles de données. La capacité à traiter les données un élément à la fois sans charger tout en mémoire fait des itérateurs un outil inestimable dans la boîte à outils d'un programmeur Python.