Jawaban cepat:
Melakukan di list()sekitar ekspresi generator (hampir) persis sama dengan memiliki []tanda kurung di sekitarnya. Jadi ya, Anda bisa melakukannya
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
Tapi Anda juga bisa melakukannya
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
Ya, itu akan mengubah ekspresi generator menjadi pemahaman daftar. Itu hal yang sama dan daftar panggilan () di atasnya. Jadi cara membuat ekspresi generator menjadi daftar adalah dengan menempatkan tanda kurung di sekitarnya.
Penjelasan detail:
Ekspresi generator adalah ekspresi "telanjang" for. Seperti:
x*x for x in range(10)
Sekarang, Anda tidak dapat menempelkannya pada satu baris dengan sendirinya, Anda akan mendapatkan kesalahan sintaks. Tapi Anda bisa meletakkan tanda kurung di sekitarnya.
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
Ini kadang-kadang disebut pemahaman generator, meskipun saya pikir nama resminya masih ekspresi generator, sebenarnya tidak ada perbedaan apa pun, tanda kurung hanya ada di sana untuk membuat sintaksnya valid. Anda tidak membutuhkannya jika Anda meneruskannya sebagai satu-satunya parameter ke suatu fungsi misalnya:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Pada dasarnya semua pemahaman lain yang tersedia di Python 3 dan Python 2.7 hanyalah gula sintaksis di sekitar ekspresi generator. Set pemahaman:
>>> {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}
Pemahaman Dict:
>>> 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}
Dan daftar pemahaman di bawah 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]
Di bawah Python 2, pemahaman daftar bukan hanya gula sintaksis. Tetapi satu-satunya perbedaan adalah bahwa x akan di bawah Python 2 bocor ke namespace.
>>> x
9
Sementara di bawah Python 3 Anda akan mendapatkan
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Ini berarti bahwa cara terbaik untuk mendapatkan cetakan yang bagus dari konten ekspresi generator Anda dengan Python adalah dengan membuat pemahaman daftar darinya! Namun, ini jelas tidak akan berhasil jika Anda sudah memiliki objek generator. Melakukan itu hanya akan membuat daftar satu generator:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
Dalam hal ini, Anda perlu menelepon list():
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Meskipun ini berhasil, tetapi agak bodoh:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]