Supposons que j'ai une liste à partir de laquelle je ne souhaite pas retourner, mais pour laquelle je souhaite générer des valeurs. Quelle est la façon la plus Pythonique de le faire?
Voici ce que je veux dire. Grâce à un calcul non paresseux, j'ai calculé la liste ['a', 'b', 'c', 'd']
, mais mon code à travers le projet utilise le calcul paresseux, donc je voudrais produire des valeurs de ma fonction au lieu de renvoyer la liste entière.
Je l'ai actuellement écrit comme suit:
my_list = ['a', 'b', 'c', 'd']
for item in my_list:
yield item
Mais cela ne me semble pas pythonique.
Utilisez iter
pour créer un itérateur de liste, par exemple.
return iter(List)
mais si vous avez déjà une liste, vous pouvez simplement la retourner, ce qui sera plus efficace.
Puisque cette question ne précise pas; Je vais fournir une réponse qui s'applique dans Python> = 3.
Si vous avez seulement besoin de renvoyer cette liste, faites comme Anurag suggère , mais si pour une raison quelconque la fonction en question doit vraiment être un générateur, vous pouvez déléguer à un autre générateur; supposons que vous vouliez suffixer la liste des résultats, mais uniquement si la liste est d'abord épuisée.
def foo():
list_ = ['a', 'b', 'c', 'd']
yield from list_
if something:
yield this
yield that
yield something_else
Dans les versions de python antérieures à 3.3, cependant, vous ne pouvez pas utiliser cette syntaxe; vous devrez utiliser le code comme dans la question, avec une boucle for et une déclaration de rendement unique dans le corps.
Alternativement; vous pouvez envelopper les générateurs dans une fonction régulière et retourner le résultat chain
ed: Cela a également l'avantage de travailler dans python 2 et 3
from itertools import chain
def foo():
list_ = ['a', 'b', 'c', 'd']
def _foo_suffix():
if something:
yield this
yield that
yield something_else
return chain(list_, _foo_suffix())
Vous pouvez construire un générateur en disant
(x for x in List)