2010-03-23 14 views
30

Angenommen, ich habe eine Liste, die ich nicht zurückgeben möchte, sondern die Werte liefert. Was ist der pythischste Weg, das zu tun?Wie pythonal alle Werte aus einer Liste ergeben?

Hier ist was ich meine. Dank einiger nicht-fauler Berechnungen habe ich die Liste ['a', 'b', 'c', 'd'] berechnet, aber mein Code durch das Projekt verwendet Lazy-Berechnung, daher möchte ich Werte von meiner Funktion liefern, anstatt die gesamte Liste zurückzugeben.

Ich schrieb es zur Zeit wie folgt:

my_list = ['a', 'b', 'c', 'd'] 
for item in my_list: 
    yield item 

Aber das mir nicht das Gefühl pythonic.

+3

Warum Müssen Sie das tun, können Sie "für x in Container" verwenden, wo Container eine Liste oder Container ist ein Iterator ... die Syntax ändert sich nicht unabhängig vom Typ, also warum ist es wichtig, ob es eine Liste ist oder ein Iterator? Sie müssen immer noch an der Liste hängen, um davon zu profitieren, also geben Sie einfach die Liste weiter. –

+0

Randbemerkung: mit "Liste" werden viele Leute es wegen des führenden Großbuchstabens als einen Klassennamen betrachten (siehe PEP 8). Sie könnten "list_" oder "my_list" usw. verwenden. – EOL

+0

EOL, ich weiß Ihre Bemerkung zu schätzen. Vielen Dank. – bodacydo

Antwort

28

Verwenden bauen können eine Liste Iterator zum Beispiel erstellen

Wenn Sie bereits eine Liste haben, können Sie einfach das zurückgeben, was effizienter sein wird.

+0

Gute Frage. Und ich habe keine Antwort. Ich werde die ganze Liste zurückgeben. Ich dachte nur, dass die Rückgabe eines Generators eine gute Idee ist, da alles im Projekt Generatoren verwendet (außer diesem Ort - ich bekomme diese Liste von einer Bibliothek, die nicht faul ist). – bodacydo

+3

Dies ist Overkill, da der Aufruf von "iter" vollständig redundant ist. – msw

+2

'iter' ist ein Overkill, aber es ist nicht komplett überflüssig, es kann verwendet werden, um sich zu erinnern, wo Sie während einer Liste durchgehen und Sie können es weitergeben, mit Liste müssen Sie auch einen Index übergeben –

1

Sie einen Generator iter sagen

(x for x in List) 
+0

So kann ich 'return (x für x in Liste)' '? – bodacydo

+1

Ja. Aber ich denke nicht, dass es Ihnen viel Mühe ersparen wird, da Sie bereits die gesamte Liste berechnet haben, warum also nicht zurückgeben? –

+6

Das eingebaute iter() erledigt das für Sie: Es ist kein Generator-Ausdruck nötig, was auch den Nachteil hat, langsamer zu sein. – EOL

34

Da diese Frage nicht spezifiziert; Ich werde eine Antwort, die in Python >= 3.3

gilt Wenn Sie nur diese Liste zurückgeben müssen, tun Sie als Anurag suggests, aber wenn aus irgendeinem Grund die betreffende Funktion wirklich ein Generator sein muss, können Sie an einen anderen Generator delegieren; Angenommen, Sie möchten die Ergebnisliste suffi- zieren, aber nur, wenn die Liste zuerst erschöpft ist.

def foo(): 
    list_ = ['a', 'b', 'c', 'd'] 
    yield from list_ 

    if something: 
     yield this 
     yield that 
     yield something_else 

In Versionen von Python vor 3.3 können Sie diese Syntax jedoch nicht verwenden; Sie müssen den Code wie in der Frage verwenden, mit einer For-Schleife und einer einzigen Yield-Anweisung im Text.

Alternativ; Sie können die Generatoren in einer regulären Funktion wickeln und den chain ed Ergebnis zurück: Das hat auch den Vorteil, in Python arbeitet 2 und 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()) 
+14

Das 'Yield from list_' Feature ist eine nette Syntax und genau das, wonach ich gesucht habe. Schade, ich kann es in 2.7 nicht verwenden. –

0

Beste Pythonically Weg, um diese Aufgabe zu tun ist

In [1]: my_list = ['a', 'b', 'c', 'd'] 

In [2]: (x for x in my_list) 
Out[2]: <generator object <genexpr> at 0x7fd9e4fdc230> 
Verwandte Themen