fonction générateur

Python

Anglais : generator function

Concept avancé

Une fonction générateur contient un ou plusieurs appels à la fonction yield.

Chaque appel à cette fonction générateur crée une instance distincte de la classe iterator qui contrôle l'exécution de la fonction générateur.

La fonction yield est très spéciale. Quand on l'appelle, il y a une sauvegarde de l'état de la fonction générateur, afin que l'exécution de cette fonction générateur puisse reprendre plus tard, juste où elle a été interrompue.

1er usage. Une autre façon de construire un itérateur


2ème usage. Les processus concurrents de simpy.

La notion de générateur et la fonction yield permettent de simuler des processus concurrents. Le processus qui exécute le générateur lorsqu'il appelle la fonction yield se suspend pendant une durée simulée, donnée par le paramètre de la fonction yield.

Cette notion de générateur est à la base de Simpy, l'environnement de simulation à événements discrets construits à l'aide de Python.


>>> import simpy # on utilise le module simpy

>>>

>>> def clock(env, name, tick):

# on définit une fonction générateur, générateur car elle contient un appel à yield

...

while True: # A chaque itération

...

print(name, env.now) # le processus imprime son nom et l'heure. L'heure provient d'un attribut du paramètre env

...

yield env.timeout(tick) # un peu bizarre derrière yield une expression dont la valeur est l'heure de réveil

# car tick est la période entre deux exécutions d'un processus donné, cf ci-dessous

...

>>> env = simpy.Environment() # on initialise l'environnement d'exécution de la simulation

>>> env.process(clock(env, 'fast', 0.5)) # on définit vraiment la fonction générateur comme étant un processus, de la cuisine

>>> env.process(clock(env, 'slow', 1))

>>> env.run(until=2) # on lance l’exécution des 2 processus jusqu'à l'heure 2

fast 0

slow 0

fast 0.5

slow 1

fast 1.0

fast 1.5

» Glossaire du langage python