Resposta rápida:
Fazer em list()torno de uma expressão geradora é (quase) exatamente equivalente a ter []colchetes ao redor dela. Então sim, você pode fazer
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
Mas você também pode fazer
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
Sim, isso transformará a expressão do gerador em uma compreensão de lista. É a mesma coisa e lista de chamadas () nela. Portanto, a maneira de transformar uma expressão geradora em uma lista é colocá-la entre colchetes.
Explicação detalhada:
Uma expressão geradora é uma expressão "nua" for. Igual a:
x*x for x in range(10)
Agora, você não pode colocar isso em uma linha por si só, você obterá um erro de sintaxe. Mas você pode colocar parênteses ao redor.
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
Isso às vezes é chamado de compreensão de gerador, embora eu ache que o nome oficial ainda seja expressão de gerador, não há realmente nenhuma diferença, os parênteses estão lá apenas para tornar a sintaxe válida. Você não precisa deles se estiver transmitindo-os como o único parâmetro para uma função, por exemplo:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Basicamente, todas as outras compreensões disponíveis no Python 3 e Python 2.7 são apenas açúcar sintático em torno de uma expressão geradora. Definir compreensões:
>>> {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}
Compreensões de ditado:
>>> 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}
E listar compreensões em 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]
No Python 2, as compreensões de lista não são apenas açúcar sintático. Mas a única diferença é que x no Python 2 vazará para o namespace.
>>> x
9
Enquanto estiver no Python 3, você obterá
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Isso significa que a melhor maneira de obter uma boa impressão do conteúdo de sua expressão geradora em Python é fazer uma lista de compreensão a partir dela! No entanto, isso obviamente não funcionará se você já tiver um objeto gerador. Isso apenas fará uma lista de um gerador:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
Nesse caso, você precisará ligar para list():
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Embora isso funcione, mas é meio estúpido:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]