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