web-dev-qa-db-fra.com

Comment produire Pythoniquement toutes les valeurs d'une liste?

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.

47
bodacydo

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.

29
Anurag Uniyal

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)
2
Johannes Charra