Comment utiliser les générateurs en Python (déclaration de rendement)

Apprenez à écrire des générateurs en Python. Comprenez le mot-clé rendement, l'évaluation paresseuse, l'optimisation de la mémoire et comparez les générateurs avec les structures de liste.

Essayez cette solution dans l'éditeur

Aperçu

Lorsque vous travaillez avec des ensembles de données volumineux, des fichiers journaux ou des flux de données infinis, le chargement simultané de tous les éléments en mémoire (comme renvoyer une grande liste) peut facilement épuiser la RAM du système et faire planter votre application. Python propose une solution brillante et économe en mémoire : les générateurs.

Un générateur est un type spécial de fonction qui renvoie un itérateur paresseux. Au lieu de calculer toutes les valeurs en même temps et de les renvoyer, un générateur génère les valeurs une par une, comme demandé. La principale différence réside dans la déclaration « rendement ». Lorsqu'une fonction génératrice appelle « rendement », elle met en pause son état d'exécution (variables, pointeur d'instruction) et renvoie la valeur obtenue. Lorsque la valeur suivante est demandée, la fonction reprend exactement là où elle s'était arrêtée.

Étant donné que les calculs du générateur sont exécutés paresseusement, ils n’utilisent presque aucune mémoire, quelle que soit la taille de l’ensemble de données. Python prend également en charge les expressions de générateur, qui utilisent la syntaxe entre parenthèses « (x pour x dans les données) » pour créer des générateurs en ligne légers sans déclarer de fonctions complètes.

Sortie de code et d'exécution

Ce script montre la génération de séquences à l'aide de fonctions génératrices avec l'instruction rendement et les expressions génératrices.

generators_demo.py
Essayez dans l'éditeur
# 1. Generator function using yield
def count_up_to(limit):
    count = 1
    while count <= limit:
        yield count
        count += 1

# Instantiating the generator
counter = count_up_to(3)
print("Memory safe generator instantiated.")

# Fetching values manually
print("Next 1:", next(counter))
print("Next 2:", next(counter))
print("Next 3:", next(counter))

# 2. Iterating with a for loop (automatically handles StopIteration)
print("\n--- Looping over generator ---")
for num in count_up_to(4):
    print("Num:", num)

# 3. Generator expression (Shorthand syntax)
squares_gen = (x**2 for x in range(1, 4))
print("\nGenerator expression elements:")
print(list(squares_gen)) # Cast to list to print all elements
Sortie terminale
Memory safe generator instantiated.
Next 1: 1
Next 2: 2
Next 3: 3

--- Looping over generator ---
Num: 1
Num: 2
Num: 3
Num: 4

Generator expression elements:
[1, 4, 9]

Mise en œuvre étape par étape

  • Définissez une fonction à l'aide du mot-clé standard def.
  • Utilisez le mot clé rendement au lieu de return pour renvoyer les valeurs au flux de l'itérateur.
  • Parcourez le générateur à l'aide d'une boucle for ou appelez la fonction next(gen) intégrée pour extraire les valeurs.
  • Utilisez des expressions génératrices (en utilisant des parenthèses) pour des conversions paresseuses simples et en ligne.

Foire aux questions

Quel est le principal avantage des générateurs par rapport aux listes ?

Efficacité de la mémoire. Les listes stockent tous les éléments simultanément dans la RAM, tandis que les générateurs génèrent les éléments un par un à la demande, vous permettant de traiter des ensembles de données plus volumineux que la mémoire totale de votre système.

Que se passe-t-il lorsqu'un générateur manque d'articles ?

Python déclenche une exception StopIteration. Une boucle for intercepte automatiquement cette exception pour quitter la boucle correctement, mais appeler manuellement next() sur un générateur épuisé lèvera l'exception.

Sujets connexes

Ressources Python recommandées

Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.