Python - Générateurs
- Renaud Jordi
- 15 nov. 2024
- 2 min de lecture
yield
Avez-vous déjà croisé ce mot-clé en Python ?
C’est un élément à la base de toutes vos boucles for 🙂
Voyons ce qu’il s’y cache.
À la différence du return qui quitte la fonction et perd tout le contexte d’exécution, le yield, la met “en pause”, jusqu’au prochain appel de “fonction” (on parle ici de générateur).
Pour exemple, redéfinissons la fonction range (en version simplifiée avec un seul paramètre) :
def myRange(max_value):
current_value = 0
while current_value < max_value:
yield current_value
current_value += 1
puis créons le générateur :
gen_r = myRange(8)
print(myRange)
>>> <function myRange at 0x000001556894F880>
print(gen_r)
>>> <generator object myRange at 0x00000155683BBC40>
myRange est une fonction, gen_r est un générateur (utilisation d’un ou plusieurs yield)
print(next(gen_r))
>>> 0
print(next(gen_r))
>>> 1
print(next(gen_r))
>>> 2
La fonction next permet d’exécuter le générateur jusqu’au prochain yield et lèvera une exception StopIteration lorsque la fonction se termine.
Pour finir, voici comment utiliser le générateur à la manière de la boucle for :
while(True):
try:
value = next(gen_r)
except StopIteration:
# end of iteration loop, break while
break
# execute statements
print(value)
Maintenant que vous savez tout, à la lecture du code suivant :
for n in myRange(8):
# execute statements
print(n)
il faut comprendre, que :
for prend en entrée un itérateur ( ici myRange(8) )
A chaque itération, la valeur générée est stockée dans n
Jusqu’à l’exception StopIteration levée par le générateur
Certains objets ont des itérateurs intégrés, tels que les strings, list, tuple, dictionnaires…
Pour cette raison, vous pouvez utiliser directement :
for element in myList:
# execute statements
print(element)
L’avantage dans tout ça ?
Pouvoir parcourir des millions d’objets un par un sans à devoir tous les stocker dans une variable avant le début de traitement du lot ;)
Gain de place en mémoire, gain de temps d’exécution avant le traitement du premier objet !
À vos claviers ;)
