Apa yang dilakukan pemahaman generator? Bagaimana cara kerjanya? Saya tidak dapat menemukan tutorial tentang itu.
Apa yang dilakukan pemahaman generator? Bagaimana cara kerjanya? Saya tidak dapat menemukan tutorial tentang itu.
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.
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 .
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], 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**2 for 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).
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:
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 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.
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
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