Apakah Anda memahami pemahaman daftar? Jika demikian, ekspresi generator adalah seperti pemahaman daftar, tetapi alih-alih menemukan semua item yang Anda minati dan mengemasnya ke dalam daftar, ia menunggu, dan menghasilkan setiap item keluar dari ekspresi, satu per satu.
>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print(filtered_list)
[5, 9, 6]
>>> len(filtered_list)
3>>> # compare to generator expression... >>> filtered_gen = (item for item in my_list if item > 3)
>>> print(filtered_gen) # notice it's a generator object
<generator object <genexpr> at 0x7f2ad75f89e0>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.... >>> next(filtered_gen)
5>>> next(filtered_gen)
9>>> next(filtered_gen)
6>>> next(filtered_gen) # Should be all out of items and give an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!... >>> # Let's prove it gives the same results as our list comprehension... >>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print(gen_to_list)
[5, 9, 6]
>>> filtered_list == gen_to_list
True>>>
Karena ekspresi generator hanya harus menghasilkan satu item dalam satu waktu, hal ini dapat menghemat penggunaan memori. Ekspresi generator paling masuk akal dalam skenario di mana Anda perlu mengambil satu item pada satu waktu, melakukan banyak kalkulasi berdasarkan item itu, lalu melanjutkan ke item berikutnya. Jika Anda membutuhkan lebih dari satu nilai, Anda juga dapat menggunakan ekspresi generator dan mengambil beberapa sekaligus. Jika Anda membutuhkan semua nilai sebelum program Anda dilanjutkan, gunakan pemahaman daftar sebagai gantinya.
Satu pertanyaan di sini. Saya menggunakan next (gen_name) untuk mendapatkan hasilnya dan berhasil dengan Python 3. Apakah ada skenario khusus di mana kita perlu menggunakan __next __ ()?
Ankit Vashistha
4
@AnkitVashistha Tidak, selalu gunakan next(...)alih-alih .__next__()di Python 3.
Todd Sewell
2
@gotgenes @AnkitVashistha If you need more than one value, you can also use a generator expression and grab a few at a time. Bisakah Anda memberi contoh tentang penggunaan ini? Terima kasih.
LittleZero
21
Pemahaman generator adalah versi malas dari pemahaman daftar.
Ini seperti pemahaman daftar kecuali bahwa ia mengembalikan iterator daripada daftar yaitu sebuah objek dengan metode next () yang akan menghasilkan elemen berikutnya.
Jika Anda tidak terbiasa dengan pemahaman daftar lihat di sini dan untuk generator lihat di sini .
Pemahaman daftar / generator adalah konstruksi yang dapat Anda gunakan untuk membuat daftar / generator baru dari yang sudah ada.
Katakanlah Anda ingin membuat daftar kuadrat dari setiap angka dari 1 sampai 10. Anda dapat melakukan ini dengan Python:
>>> [x**2for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
di sini, range(1,11)menghasilkan daftar [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], tetapi rangefungsinya bukan generator sebelum Python 3.0, dan oleh karena itu konstruksi yang saya gunakan adalah pemahaman daftar.
Jika saya ingin membuat generator yang melakukan hal yang sama, saya dapat melakukannya seperti ini:
>>> (x**2for x in xrange(1,11))
<generator object at 0x7f0a79273488>
Dalam Python 3, bagaimanapun, rangeadalah generator, jadi hasilnya hanya bergantung pada sintaks yang Anda gunakan (tanda kurung siku atau tanda kurung bulat).
Ini salah. Apakah ekspresi luar adalah generator tidak ada hubungannya dengan apakah ekspresi dalam adalah. Meskipun jelas, biasanya tidak banyak gunanya dalam ekspresi generator yang mengambil elemen dari daftar, Anda dapat melakukannya.
Antimony
Bisakah ini ditulis ulang dengan lebih jelas? Saya mengerti apa yang Anda katakan, tetapi seperti yang dikatakan Antimony, sepertinya Anda mengatakan sesuatu yang lain. (dan hal yang sepertinya Anda katakan salah)
Lyndon White
4
Pemahaman generator adalah cara mudah untuk membuat generator dengan struktur tertentu. Katakanlah Anda ingin generatoryang mengeluarkan satu per satu semua bilangan genap your_list. Jika Anda membuatnya dengan menggunakan gaya fungsi akan menjadi seperti ini:
defallEvens( L ):for number in L:
if number % 2is0:
yield number
evens = allEvens( yourList )
Anda bisa mendapatkan hasil yang sama dengan ekspresi pemahaman generator ini:
evens = ( number for number in your_list if number % 2 == 0 )
Dalam kedua kasus tersebut, ketika Anda menelepon, next(evens)Anda mendapatkan nomor genap berikutnya your_list.
Pemahaman generator adalah pendekatan untuk membuat iterable, seperti kursor yang bergerak pada sumber daya. Jika Anda mengetahui kursor mysql atau kursor mongodb, Anda mungkin menyadari bahwa seluruh data aktual tidak pernah dimuat ke dalam memori sekaligus, tetapi satu per satu. Kursor Anda bergerak maju mundur, tetapi selalu ada satu baris / elemen daftar di memori.
Singkatnya, dengan menggunakan pemahaman generator Anda dapat dengan mudah membuat kursor di python.
Generator sama seperti daftar saja, perbedaan kecilnya adalah bahwa dalam daftar kita mendapatkan semua nomor atau item daftar yang diperlukan sekaligus, tetapi di generator nomor yang diperlukan dihasilkan satu per satu. Jadi untuk mendapatkan item yang dibutuhkan kita harus menggunakan loop for untuk mendapatkan semua item yang dibutuhkan.
#to get all the even numbers in given rangedefallevens(n):for x in range(2,n):
if x%2==0:
yield x
for x in allevens(10)
print(x)
#output2468
Jawaban:
Apakah Anda memahami pemahaman daftar? Jika demikian, ekspresi generator adalah seperti pemahaman daftar, tetapi alih-alih menemukan semua item yang Anda minati dan mengemasnya ke dalam daftar, ia menunggu, dan menghasilkan setiap item keluar dari ekspresi, satu per satu.
>>> my_list = [1, 3, 5, 9, 2, 6] >>> filtered_list = [item for item in my_list if item > 3] >>> print(filtered_list) [5, 9, 6] >>> len(filtered_list) 3 >>> # compare to generator expression ... >>> filtered_gen = (item for item in my_list if item > 3) >>> print(filtered_gen) # notice it's a generator object <generator object <genexpr> at 0x7f2ad75f89e0> >>> len(filtered_gen) # So technically, it has no length Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'generator' has no len() >>> # We extract each item out individually. We'll do it manually first. ... >>> next(filtered_gen) 5 >>> next(filtered_gen) 9 >>> next(filtered_gen) 6 >>> next(filtered_gen) # Should be all out of items and give an error Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> # Yup, the generator is spent. No values for you! ... >>> # Let's prove it gives the same results as our list comprehension ... >>> filtered_gen = (item for item in my_list if item > 3) >>> gen_to_list = list(filtered_gen) >>> print(gen_to_list) [5, 9, 6] >>> filtered_list == gen_to_list True >>>
Karena ekspresi generator hanya harus menghasilkan satu item dalam satu waktu, hal ini dapat menghemat penggunaan memori. Ekspresi generator paling masuk akal dalam skenario di mana Anda perlu mengambil satu item pada satu waktu, melakukan banyak kalkulasi berdasarkan item itu, lalu melanjutkan ke item berikutnya. Jika Anda membutuhkan lebih dari satu nilai, Anda juga dapat menggunakan ekspresi generator dan mengambil beberapa sekaligus. Jika Anda membutuhkan semua nilai sebelum program Anda dilanjutkan, gunakan pemahaman daftar sebagai gantinya.
sumber
next(...)
alih-alih.__next__()
di Python 3.If you need more than one value, you can also use a generator expression and grab a few at a time
. Bisakah Anda memberi contoh tentang penggunaan ini? Terima kasih.Pemahaman generator adalah versi malas dari pemahaman daftar.
Ini seperti pemahaman daftar kecuali bahwa ia mengembalikan iterator daripada daftar yaitu sebuah objek dengan metode next () yang akan menghasilkan elemen berikutnya.
Jika Anda tidak terbiasa dengan pemahaman daftar lihat di sini dan untuk generator lihat di sini .
sumber
Pemahaman daftar / generator adalah konstruksi yang dapat Anda gunakan untuk membuat daftar / generator baru dari yang sudah ada.
Katakanlah Anda ingin membuat daftar kuadrat dari setiap angka dari 1 sampai 10. Anda dapat melakukan ini dengan Python:
>>> [x**2 for x in range(1,11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
di sini,
range(1,11)
menghasilkan daftar[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
, tetapirange
fungsinya bukan generator sebelum Python 3.0, dan oleh karena itu konstruksi yang saya gunakan adalah pemahaman daftar.Jika saya ingin membuat generator yang melakukan hal yang sama, saya dapat melakukannya seperti ini:
>>> (x**2 for x in xrange(1,11)) <generator object at 0x7f0a79273488>
Dalam Python 3, bagaimanapun,
range
adalah generator, jadi hasilnya hanya bergantung pada sintaks yang Anda gunakan (tanda kurung siku atau tanda kurung bulat).sumber
Pemahaman generator adalah cara mudah untuk membuat generator dengan struktur tertentu. Katakanlah Anda ingin
generator
yang mengeluarkan satu per satu semua bilangan genapyour_list
. Jika Anda membuatnya dengan menggunakan gaya fungsi akan menjadi seperti ini:def allEvens( L ): for number in L: if number % 2 is 0: yield number evens = allEvens( yourList )
Anda bisa mendapatkan hasil yang sama dengan ekspresi pemahaman generator ini:
evens = ( number for number in your_list if number % 2 == 0 )
Dalam kedua kasus tersebut, ketika Anda menelepon,
next(evens)
Anda mendapatkan nomor genap berikutnyayour_list
.sumber
Pemahaman generator adalah pendekatan untuk membuat iterable, seperti kursor yang bergerak pada sumber daya. Jika Anda mengetahui kursor mysql atau kursor mongodb, Anda mungkin menyadari bahwa seluruh data aktual tidak pernah dimuat ke dalam memori sekaligus, tetapi satu per satu. Kursor Anda bergerak maju mundur, tetapi selalu ada satu baris / elemen daftar di memori.
Singkatnya, dengan menggunakan pemahaman generator Anda dapat dengan mudah membuat kursor di python.
sumber
Contoh lain dari pemahaman Generator:
print 'Generator comprehensions' def sq_num(n): for num in (x**2 for x in range(n)): yield num for x in sq_num(10): print x
sumber
Generator sama seperti daftar saja, perbedaan kecilnya adalah bahwa dalam daftar kita mendapatkan semua nomor atau item daftar yang diperlukan sekaligus, tetapi di generator nomor yang diperlukan dihasilkan satu per satu. Jadi untuk mendapatkan item yang dibutuhkan kita harus menggunakan loop for untuk mendapatkan semua item yang dibutuhkan.
#to get all the even numbers in given range def allevens(n): for x in range(2,n): if x%2==0: yield x for x in allevens(10) print(x) #output 2 4 6 8
sumber