素早い回答:
実行list()ジェネレータ式の周りには(ほとんど)を有すると正確に等価である []その周りブラケット。そう、そうすることができます
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
しかし、あなたも同様に行うことができます
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
はい、それはジェネレータ式をリスト内包に変えます。それはlist()を呼び出すのと同じことです。したがって、ジェネレータ式をリストにする方法は、括弧で囲むことです。
詳細な説明:
ジェネレータ式は「ネイキッド」for式です。そのようです:
x*x for x in range(10)
さて、それだけでは行に固定できないため、構文エラーが発生します。ただし、括弧を付けることができます。
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
これはジェネレーター内包表記と呼ばれることもありますが、正式名称はまだジェネレーター式であると思いますが、実際には違いはありません。括弧は構文を有効にするためだけにあります。たとえば、関数への唯一のパラメーターとして渡す場合は必要ありません。
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
基本的に、Python 3とPython 2.7で利用可能な他のすべての内包表記は、ジェネレーター式の構文糖衣です。理解度を設定する:
>>> {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((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}
また、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]
Python 2では、リスト内包表記は単に構文上の砂糖ではありません。しかし、唯一の違いは、xがPython 2で名前空間にリークすることです。
>>> x
9
Python 3の下では、
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
これは、Pythonでジェネレータ式のコンテンツを適切に出力するための最良の方法は、リストの内包を理解することであることを意味します。ただし、ジェネレーターオブジェクトが既にある場合、これは明らかに機能しません。これを行うと、1つのジェネレータのリストが作成されます。
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
その場合は、以下を呼び出す必要がありますlist()。
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
これは機能しますが、少し愚かですが:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]