Différencier les fonctions et les générateurs
Dans cette étape, vous apprendrez les principales différences entre les fonctions Python ordinaires et les générateurs. Comprendre cette distinction est essentiel pour écrire un code efficace et économisant en mémoire, en particulier lorsqu'il s'agit de traiter de grands ensembles de données ou des séquences infinies.
Fonctions :
Une fonction est un bloc de code qui effectue une tâche spécifique. Lorsqu'une fonction est appelée, elle exécute son code, effectue éventuellement des calculs et retourne une valeur (ou None
si aucune instruction return
explicite n'est présente). L'état de la fonction n'est pas conservé entre les appels.
Générateurs :
Un générateur est un type spécial de fonction qui utilise le mot - clé yield
au lieu de return
. Lorsqu'un générateur est appelé, il retourne un objet itérateur. Chaque fois que vous demandez une valeur à l'itérateur, le générateur s'exécute jusqu'à ce qu'il rencontre une instruction yield
. Le générateur se met alors en pause, sauvegarde son état et produit la valeur. La prochaine fois qu'une valeur est demandée, le générateur reprend là où il s'est arrêté.
Illustrons cela avec un exemple. Tout d'abord, créez un fichier nommé function_vs_generator.py
dans votre répertoire ~/project
en utilisant l'éditeur VS Code.
## ~/project/function_vs_generator.py
## Fonction ordinaire
def square_numbers_function(numbers):
result = []
for number in numbers:
result.append(number * number)
return result
## Fonction génératrice
def square_numbers_generator(numbers):
for number in numbers:
yield number * number
## Utilisation exemple
numbers = [1, 2, 3, 4, 5]
## Utilisation de la fonction
function_result = square_numbers_function(numbers)
print("Function Result:", function_result)
## Utilisation du générateur
generator_result = square_numbers_generator(numbers)
print("Generator Result:", list(generator_result)) ## Convertir le générateur en liste pour l'impression
Maintenant, exécutez le script Python :
python ~/project/function_vs_generator.py
Vous devriez voir la sortie suivante :
Function Result: [1, 4, 9, 16, 25]
Generator Result: [1, 4, 9, 16, 25]
La fonction et le générateur produisent le même résultat. Cependant, la principale différence réside dans la façon dont ils l'obtiennent. La fonction calcule tous les carrés et les stocke dans une liste avant de retourner. Le générateur, en revanche, produit chaque carré un par un, seulement lorsqu'il est demandé.
Pour illustrer davantage la différence, modifions le script pour afficher le type de l'objet retourné :
## ~/project/function_vs_generator.py
## Fonction ordinaire
def square_numbers_function(numbers):
result = []
for number in numbers:
result.append(number * number)
return result
## Fonction génératrice
def square_numbers_generator(numbers):
for number in numbers:
yield number * number
## Utilisation exemple
numbers = [1, 2, 3, 4, 5]
## Utilisation de la fonction
function_result = square_numbers_function(numbers)
print("Function Result Type:", type(function_result))
## Utilisation du générateur
generator_result = square_numbers_generator(numbers)
print("Generator Result Type:", type(generator_result))
Exécutez le script à nouveau :
python ~/project/function_vs_generator.py
La sortie sera :
Function Result Type: <class 'list'>
Generator Result Type: <class 'generator'>
Cela montre clairement que la fonction retourne une list
, tandis que le générateur retourne un objet generator
. Les générateurs sont économes en mémoire car ils ne stockent pas toutes les valeurs en mémoire à la fois. Ils génèrent les valeurs à la demande.