top of page
Rechercher

Python - Générateurs

  • Photo du rédacteur: Renaud Jordi
    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 ;)



 
 

© LH&TECH, tous droits réservés.

bottom of page