Générateurs(Yield) en Python

Il y a beaucoup de travail pour créer un itérateur en Python. Nous devons implémenter une classe avec les méthodes __iter__() et __next__(), garder une trace des états internes et déclencher StopIteration lorsqu’il n’y a aucune valeur à retourner. Le générateur vient à faciliter la création des itérateurs.

Les générateurs en Python sont un moyen simple de créer des itérateurs. Tous les étapes que nous avons mentionnés ci-dessus sont automatiquement gérés par des générateurs en Python.

Un générateur est une fonction qui renvoie un objet (iterator) sur lequel nous pouvons itérer.
 
 

Créer un générateur en Python

Il est assez simple de créer un générateur en Python. C’est aussi simple que de définir une fonction normale, mais avec l’instruction yield au lieu de l’instruction return.

Si une fonction contient au moins une instruction yield (elle peut contenir d’autres instructions yield ou return), elle devient une fonction générateur. Yield et return, les deux renverront une valeur d’une fonction.

La différence est la suivante: l’instruction return termine une fonction entièrement, l’instruction yield met la fonction en pause et enregistre tous ses états.
 

Exemple:

Voici un exemple d’une fonction générateur simple.

def my_gen():
    print('Ceci est affiché en premier')
    yield 100

    print('Ceci est affiché en deuxième')
    yield 200

    print('Il est affiché à la fin')
    yield 300

Dans l’exemple ci-dessus, my_gen() est une fonction générateur. Il utilise l’instruction ‘yield’ au lieu du mot-clé ‘return’. Ainsi, cela renverra la valeur par rapport au mot clé ‘yield’ à chaque appel. Cependant, vous devez créer un itérateur pour cette fonction, comme indiqué ci-dessous.

>>> gen = my_gen()
>>> next(gen)
Ceci est affiché en premier
100
>>> next(gen)
Ceci est affiché en deuxième
200
>>> next(gen)
Il est affiché à la fin
300

Si vous ajoutez le mot-clé return, cela mettra fin à la fonction.

La fonction générateur suivante inclut le mot-clé ‘return’.

def my_gen():
    print('Ceci est affiché en premier')
    yield 100
    
    return 

    print('Ceci est affiché en deuxième')
    yield 200

    print('Il est affiché à la fin')
    yield 300

Maintenant, exécutez la fonction ci-dessus:

>>> gen = my_gen()
>>> next(gen)
Ceci est affiché en premier
100
>>> next(gen)
Traceback (most recent call last):
File "<main#5>", line 1, in <module>
it.__next__()
StopIteration

Comme vous pouvez le voir, le générateur ci-dessus cesse de s’exécuter après avoir obtenu le premier élément car le mot-clé ‘return’ est utilisé après avoir généré le premier élément.
 
 
La fonction générateur peut également utiliser la boucle for.

def my_gen(x):
    for i in range(x):
        yield i

La fonction générateur my_gen() peut être appelée comme ci-dessous.

>>> gen = my_gen(4)
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
>>> next(seq)
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
it.__next__()
StopIteration

La fonction se termine lorsque next() rencontre l’erreur StopIteration.
 

Expression générateur

Python fournit également une expression générateur qui est un moyen plus court de définir des fonctions générateur simples. L’expression générateur est un générateur anonyme. Voici une expression générateur pour la fonction square().

>>> square = (x*x for x in range(4))
>>> print(next(square))
0
>>> print(next(square))
1
>>> print(next(square))
4
>>> print(next(square))
9

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.