A quoi sert le mot clé yield en Python ?

Le langage Python propose de nombreux mots-clés à utiliser dans le code. Parmi eux, yield est un mot-clé particulier. Il est lié aux générateurs. Pour comprendre les générateurs, il faut avant tout comprendre comment fonctionnent les itérations.

L'itération est une action très courante en développement, elle consiste à parcourir une liste d'éléments une à une. On utilise le plus souvent les mots-clés for et in pour effectuer cette action.

maListe = [x * 2 for x in range(4)] //Cette liste contient les 4 premiers résultats de la multiplication par 2
for i in maListe:
print(i)
Résultat :
0
2
4
6

N'importe quel objet que l'on peut parcourir avec les mots-clés for et in est un objet itérable. Il y a bien sûr les listes mais aussi les chaînes de caractères ou encore les fichiers. Les itérateurs peuvent être lus autant de fois qu'on le souhaite car ils sont intégralement stockés en mémoire.

Les générateurs sont des itérateurs mais ils ne fonctionnent pas de la même façon. Au lieu de stocker l'intégralité de l'objet en mémoire, un générateur récupère la valeur à la volée. De cette manière, l'objet n'est pas stocké en mémoire. L'inconvénient est qu'un générateur ne peut être parcouru qu'une seule fois. Pour déclarer un générateur, on utilise des parenthèses () alors que l'on utilise des crochets [] pour un itérateur.

maListe = (x * 2 for x in range(4))
for i in maListe:
print(i)
Résultat :
0
2
4
6

Le mot-clé yield est lié aux générateurs. Il fonctionne de la même manière que le mot-clé return mais au lieu de retourner une variable, il retourne un générateur. Cette fonctionnalité permet de gérer une fonction qui retournerait un ensemble important de valeurs. Le code de la fonction n'est pas entièrement exécuté à chaque appel, il est exécuté la première fois puis à chaque appel du générateur, la boucle est incrémentée d'un cran. Le générateur s'arrête quand il n'y a plus de valeur à retourner. Cela permet également de masquer la complexité du code lié au générateur.

def generateurMultiplicationPar2():
maliste = range(4)
for i in maliste:
yield i*2

monGenerateur = generateurMultiplicationPar2()
for i in monGenerateur:
print(i)
Résultat :
0
2
4
6

Python