Réponse rapide:
Faire list()
autour d'un générateur d'expression est (presque) exactement équivalent à []
des crochets autour d'elle. Donc oui, vous pouvez le faire
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
Mais vous pouvez tout aussi bien le faire
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
Oui, qui fera tourner le générateur d'expression dans une compréhension de liste. C'est la même chose et la liste d'appel() sur celui-ci. Ainsi, la manière de faire un générateur d'expression dans une liste est de mettre des parenthèses autour d'elle.
Explication détaillée:
Un générateur d'expression est un "nu" for
expression. Comme suit:
x*x for x in range(10)
Maintenant, vous ne pouvez pas coller que sur une ligne, vous obtiendrez une erreur de syntaxe. Mais vous pouvez mettre des parenthèses autour d'elle.
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
Cela est parfois appelé un générateur de compréhension, même si je pense que le nom officiel est toujours générateur d'expression, il n'y a pas vraiment de différence, les parenthèses ne sont là que pour rendre la syntaxe valide. Vous n'en avez pas besoin si vous êtes de passage dans le seul paramètre à une fonction, par exemple:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Fondamentalement, tous les autres interprétations disponibles en Python 3 et Python 2.7 est juste sucre syntaxique autour d'un générateur d'expression. Ensemble des compréhensions:
>>> {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}
Dict interprétations:
>>> 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}
Et les interprétations de la liste sous 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]
Sous Python 2, interprétations de la liste n'est pas juste de sucre syntaxique. Mais la seule différence, c'est que x sera sous Python 2 de fuite dans l'espace de noms.
>>> x
9
Alors que sous Python 3, vous aurez
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Cela signifie que la meilleure façon d'obtenir une impression agréable de le contenu de votre générateur d'expression en Python est de faire une liste de compréhension de sortir! Toutefois, cela ne fonctionne évidemment pas si vous avez déjà un objet de générateur. Faire cela va juste faire une liste d'un générateur:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
Dans ce cas, vous aurez besoin de faire appel list()
:
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Bien que cela fonctionne, mais c'est un peu stupide:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]