Wenn ich in der Python-Shell ein Listenverständnis eingebe, wie z.
>>> [x for x in string.letters if x in [y for y in "BigMan on campus"]]
Ich bekomme ein schön gedrucktes Ergebnis:
['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
Gleiches gilt für ein Wörterbuchverständnis:
>>> {x:x*2 for x in range(1,10)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
Wenn ich einen Generatorausdruck eingebe, erhalte ich keine so freundliche Antwort:
>>> (x for x in string.letters if x in (y for y in "BigMan on campus"))
<generator object <genexpr> at 0x1004a0be0>
Ich weiß, ich kann dies tun:
>>> for i in _: print i,
a c g i m n o p s u B M
Kann ich das Generatorobjekt in der interaktiven Shell einfach auswerten und ausdrucken (oder eine Hilfsfunktion schreiben)?
generator object
während ich an der interaktiven Eingabeaufforderung interaktiv ein Verständnis aufbaue. Anrufenlist(_)
macht das. Was ich getan habe, ist, Listenverständnisse zu verwenden und diese dann in größerem Code in Genexp umzuwandeln. Diese können zur Laufzeit auf eine Weise fehlschlagen, die Listenverständnisse nicht haben.list()
und sie dann auszudrucken.Antworten:
Schnelle Antwort:
Das Umgehen
list()
eines Generatorausdrucks ist (fast) genau gleichbedeutend mit[]
Klammern. Also ja, du kannst es tunAber Sie können es genauso gut tun
Ja, das macht den Generatorausdruck zu einem Listenverständnis. Es ist dasselbe und ruft list () auf. Um einen Generatorausdruck in eine Liste aufzunehmen, müssen Sie ihn in Klammern setzen.
Ausführliche Erklärung:
Ein Generatorausdruck ist ein "nackter"
for
Ausdruck. Wie so:Jetzt können Sie das nicht alleine in eine Zeile kleben, es wird ein Syntaxfehler angezeigt. Aber Sie können es in Klammern setzen.
Dies wird manchmal als Generatorverständnis bezeichnet, obwohl ich denke, dass der offizielle Name immer noch Generatorausdruck ist, gibt es keinen wirklichen Unterschied, die Klammern dienen nur dazu, die Syntax gültig zu machen. Sie benötigen sie nicht, wenn Sie sie als einzigen Parameter an eine Funktion übergeben, zum Beispiel:
Grundsätzlich sind alle anderen in Python 3 und Python 2.7 verfügbaren Verständnisse nur syntaktischer Zucker um einen Generatorausdruck. Verständnis festlegen:
Diktatverständnis:
Und Listenverständnisse unter Python 3:
Unter Python 2 ist Listenverständnis nicht nur syntaktischer Zucker. Der einzige Unterschied ist jedoch, dass x unter Python 2 in den Namespace gelangt.
Unter Python 3 erhalten Sie
Dies bedeutet, dass der beste Weg, um einen schönen Ausdruck des Inhalts Ihres Generatorausdrucks in Python zu erhalten, darin besteht, daraus ein Listenverständnis zu machen! Dies funktioniert jedoch offensichtlich nicht, wenn Sie bereits ein Generatorobjekt haben. Dadurch wird nur eine Liste mit einem Generator erstellt:
In diesem Fall müssen Sie anrufen
list()
:Das funktioniert zwar, ist aber irgendwie dumm:
quelle
list( generator-expression )
druckt nicht den Generatorausdruck; Es wird eine Liste erstellt (und dann in einer interaktiven Shell gedruckt). Anstatt eine Liste zu generieren, können Sie in Python 3 den Generatorausdruck in eine print-Anweisung aufteilen. Dh)print(*(generator-expression))
. Dadurch werden die Elemente am Anfang und am Ende ohne Kommas und ohne Klammern gedruckt.Im Gegensatz zu einer Liste oder einem Wörterbuch kann ein Generator unendlich sein. Dies würde nicht funktionieren:
Wenn Sie einen Generator lesen, wird er geändert, sodass es keine perfekte Möglichkeit gibt, ihn anzuzeigen. Sie können ein Beispiel für die Leistung des Generators anzeigen
quelle
Sie können den Ausdruck einfach in einen Aufruf einbinden
list
:quelle
Oder Sie können jederzeit
map
einen Iterator verwenden, ohne eine Zwischenliste erstellen zu müssen:quelle
quelle