Schnelle Antwort:
Das Umgehen list()eines Generatorausdrucks ist (fast) genau gleichbedeutend mit []Klammern. Also ja, du kannst es tun
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
Aber Sie können es genauso gut tun
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
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" forAusdruck. Wie so:
x*x for x in range(10)
Jetzt können Sie das nicht alleine in eine Zeile kleben, es wird ein Syntaxfehler angezeigt. Aber Sie können es in Klammern setzen.
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
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:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
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:
>>> {x*x for x in range(10)}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> set(x*x for x in range(10))
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
Diktatverständnis:
>>> dict((x, x*x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> {x: x*x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Und Listenverständnisse unter Python 3:
>>> list(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Unter Python 2 ist Listenverständnis nicht nur syntaktischer Zucker. Der einzige Unterschied ist jedoch, dass x unter Python 2 in den Namespace gelangt.
>>> x
9
Unter Python 3 erhalten Sie
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
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:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
In diesem Fall müssen Sie anrufen list():
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Das funktioniert zwar, ist aber irgendwie dumm:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]