Di shell Python, jika saya memasukkan pemahaman daftar seperti:
>>> [x for x in string.letters if x in [y for y in "BigMan on campus"]]
Saya mendapatkan hasil cetakan yang bagus:
['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
Sama untuk pemahaman kamus:
>>> {x:x*2 for x in range(1,10)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
Jika saya memasukkan ekspresi generator, saya tidak mendapatkan respons yang ramah:
>>> (x for x in string.letters if x in (y for y in "BigMan on campus"))
<generator object <genexpr> at 0x1004a0be0>
Saya tahu saya bisa melakukan ini:
>>> for i in _: print i,
a c g i m n o p s u B M
Selain itu (atau menulis fungsi pembantu) dapatkah saya dengan mudah mengevaluasi dan mencetak objek generator itu di shell interaktif?
generator object
saat saya secara interaktif membangun pemahaman pada prompt interaktif. Meneleponlist(_)
memang begitu. Apa yang telah saya lakukan adalah menggunakan pemahaman daftar kemudian mengubahnya menjadi genexp dalam kode yang lebih besar. Ini bisa gagal pada waktu berjalan dengan cara yang tidak dilakukan oleh pemahaman daftar.list()
, dan kemudian mencetaknya.Jawaban:
Jawaban cepat:
Melakukan di
list()
sekitar ekspresi generator (hampir) persis sama dengan memiliki[]
tanda kurung di sekitarnya. Jadi ya, Anda bisa melakukannyaTapi Anda juga bisa melakukannya
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:Sekarang, Anda tidak dapat menempelkannya pada satu baris dengan sendirinya, Anda akan mendapatkan kesalahan sintaks. Tapi Anda bisa meletakkan tanda kurung di sekitarnya.
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:
Pada dasarnya semua pemahaman lain yang tersedia di Python 3 dan Python 2.7 hanyalah gula sintaksis di sekitar ekspresi generator. Set pemahaman:
Pemahaman Dict:
Dan daftar pemahaman di bawah Python 3:
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.
Sementara di bawah Python 3 Anda akan mendapatkan
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:
Dalam hal ini, Anda perlu menelepon
list()
:Meskipun ini berhasil, tetapi agak bodoh:
sumber
list( generator-expression )
tidak mencetak ekspresi generator; itu membuat daftar (dan kemudian mencetaknya dalam shell interaktif). Alih-alih membuat daftar, dengan Python 3, Anda dapat membagi ekspresi generator menjadi pernyataan cetak. Yaitu)print(*(generator-expression))
. Ini mencetak elemen tanpa koma dan tanpa tanda kurung di awal dan akhir.Tidak seperti daftar atau kamus, generator bisa jadi tidak terbatas. Melakukan ini tidak akan berhasil:
Selain itu, membaca generator mengubahnya, jadi tidak ada cara sempurna untuk melihatnya. Untuk melihat contoh keluaran generator bisa Anda lakukan
sumber
[next(g1) for i in range(10)]
dengan Python 3.Anda bisa membungkus ekspresi dalam panggilan ke
list
:sumber
Atau Anda selalu dapat
map
melalui iterator, tanpa perlu membuat daftar perantara:sumber
sumber