Humour Tech ~1 min de lecture

Réutiliser les valeurs d’un générateur Python

— Le total donne 30 au premier calcul, puis 0 au second. — Le générateur a déjà tout donné. Littéralement.

Deux colonnes comparent les calculs sur les valeurs 10 et 20. À gauche, parcours réussi : convertir le générateur en liste avant les calculs permet d’obtenir 30 deux fois. À droite, parcours en échec : le premier calcul sur le générateur donne 30, l’épuise, puis le second donne 0.
Deux parcours montrent qu’une liste conserve les valeurs pour le second calcul, tandis qu’un générateur consommé ne fournit plus rien.

Un premier sum(g) renvoie 30, le second 0 : le générateur a déjà tout donné, littéralement. En Python, un générateur produit ses valeurs à la demande, sans stocker toute la séquence, mais ne recommence pas au début après un parcours.

Avec g = (n for n in [10, 20]), le premier sum(g) consomme les deux valeurs et renvoie 30. Le générateur est alors épuisé. Un second sum(g) renvoie 0, car il ne reste aucune valeur à additionner.

Si plusieurs calculs doivent parcourir les mêmes valeurs et que leur volume tient en mémoire, utilisez valeurs = list(g) avant de consommer le générateur. Chaque appel à sum(valeurs) renverra alors 30. La conversion doit avoir lieu avant le premier calcul, pas après.

Pour parcourir deux fois les valeurs d’un générateur, convertissez-le en liste avant de le consommer.

Dans le même esprit

À lire ensuite