Indonesian (Bahasa Indonesia) translation by Aditia Dwiperdana (you can also view the original English article)
Generator memudahkan kita membuat iterasi dalam Python dan menghasilkan kode lebih sedikit. Tutorial ini akan mengenalkan kamu pada Python Generator, keuntungannya, dan bagaimana mereka bekerja.
Dasar
Sebuah generator adalah fungsi yang mengembalikan objek generator yang bisa kita panggil method next(), sedemikian rupa sehingga setiap pemanggilan mengembalikan nilai berikutnya. Fungsi normal pada Python menggunakan keyword return untuk mengembalikan suatu nilai, tapi generator menggunakan keyword yield untuk mengembalikan nilai. Ini berarti setiap fungsi Python yang berisi yield adalah fungsi generator.
Statement yield biasanya menghentikan fungsi dan menyimpan state lokal agar bisa dilanjutkan tepat seperti saat dihentikan. Fungsi generator bisa memiliki satu atau lebih statement yield.
Sebuah generator juga merupakan sebuah iterator, tapi apa itu iterator? Sebelum kita membahas detail generator, saya rasa penting untuk mengetahui apa itu iterator karena merupakakn bagian penting dari diskusi ini.
Iterator Python
Sebuah iterator Python adalah kelas yang mendefinisikan sebuah fungsi __iter__(). Sebagian besar objek Python bersifat iterable, artinya kamu bisa melakukan loop terhadap setiap elemen dalam objek tersebut. Contoh iterable pada Python misalnya string, list, tuple, dictionary, dan range.
Kita lihat contoh di bawah, kita melakukan loop terhadap daftar warna:
1 |
colors= [“red”,”blue”,”yellow”] |
2 |
|
3 |
def my_funct(): |
4 |
for color in colors: |
5 |
print color |
Di balik layar, statement for akan memanggil iter() pada objek list. Lalu fungsi akan mengembalikan objek iterator yang memiliki fungsi __next__(), yang akan mengakses masing-masing warna, satu per satu. Saat tidak ada warna tersisa, __next__ akan melempar exception stopIteration, yang akan menginformasikan loop for untuk berhenti.
Mengiterasi sebuah Dictionary
1 |
d = {'x': 10, 'y': 20, 'z': 30} |
2 |
for k,v in d.items(): |
3 |
print k, v |
4 |
|
5 |
#result
|
6 |
# y 20
|
7 |
# x 10
|
8 |
# z 30
|
Mengiterasi Baris dalam file CSV
1 |
import csv |
2 |
|
3 |
with open('file.csv', newline='') as File: |
4 |
reader = csv.reader(File) |
5 |
for row in reader: |
6 |
yield row |
Mengiterasi String
1 |
my_string = 'Generators' |
2 |
for string in my_string: |
3 |
print (string) |
4 |
|
5 |
#result
|
6 |
|
7 |
# G
|
8 |
# e
|
9 |
# n
|
10 |
# e
|
11 |
# r
|
12 |
# a
|
13 |
# t
|
14 |
# o
|
15 |
# r
|
16 |
# s
|
Keuntungan Menggunakan Generator
Mari kita bahas beberapa keuntungan menggunakan generator dibanding iterator:
Mudah untuk diimplementasi
Membuat iterator pada Python memerlukan kamu untuk mengimplementasi kelas dengan fungsi __iter__() dan __next__() dan menangani semua error stopIteration yang mungkin muncul.
1 |
class Reverse: |
2 |
"""Iterator for looping over a sequence backwards."""
|
3 |
def __init__(self, data): |
4 |
self.data = data |
5 |
self.index = len(data) |
6 |
|
7 |
def __iter__(self): |
8 |
return self |
9 |
|
10 |
def __next__(self): |
11 |
if self.index == 0: |
12 |
raise StopIteration |
13 |
self.index = self.index - 1 |
14 |
return self.data[self.index] |
Seperti yang kamu lihat di atas, implementasinya sangat panjang. Semua beban ini secara otomatis ditangani oleh generator.
Penggunaan Memory Lebih Sedikit
Generator membantu meminimalkan penggunaan memory, terutama saat berurusan dengan set data yang besar, karena generator hanya akan mengembalikan objek satu per satu.
Performa dan Optimasi yang Lebih Baik
Generator pada dasarnya pemalas. Ini artinya mereka hanya menghasilkan nilai saat dibutuhkan saja. Tidak seperti iterator biasa, di mana semua nilai dihasilkan tidak peduli apakah mereka akan digunakan atau tidak, generator hanya menghasilkan nilai yang dibutuhkan. Inilah yang mendorong program untuk bekerja lebih cepat.
Bagaimana membuat Generator pada Python
Membuat generator sangat mudah. Yang perlu kamu lakukan hanyalah menulis fungsi biasa, tapi dengan statement yield, bukan return, seperti pada contoh di bawah.
1 |
def gen_function(): |
2 |
yield "python" |
Statement return menghentikan fungsi sepenuhnya, sedangkan yield hanya menghentikan fungsi sampai dipanggil kembali oleh fungsi next().
Contohnya, program di bawah menggunakan statement yield dan next().
1 |
def myGenerator(l): |
2 |
total = 1 |
3 |
for n in l: |
4 |
yield total |
5 |
total += n |
6 |
|
7 |
newGenerator = myGenerator([10,3]) |
8 |
|
9 |
print(next(newGenerator)) |
10 |
print(next(newGenerator)) |
11 |
|
12 |
Bagaimana Generator Python Bekerja
Kita lihat bagaimana generator bekerja. Lihat contoh di bawah.
1 |
# generator_example.py
|
2 |
|
3 |
def myGenerator(l): |
4 |
total = 0 |
5 |
for n in l: |
6 |
total += n |
7 |
yield total |
8 |
|
9 |
|
10 |
newGenerator = myGenerator([10,20,30]) |
11 |
|
12 |
print(next(newGenerator)) |
13 |
print(next(newGenerator)) |
14 |
print(next(newGenerator)) |
15 |
Pada fungsi di atas, kita mendefinisikan generator bernama myGenerator, yang menerima argumen l berupa list. Lalu kita definisikan variabel total dan mengatur nilainya menjadi nol. Selain itu, kita melakukan loop ke setiap elemen pada list dan menambahkannya ke variabel total.
Lalu kita buat instance newGenerator dan panggil fungsi next(). Ini akan menjalankan kode sampai berhenti pada nilai pertama dari total, yang saat ini bernilai 0. Fungsi akan menyimpan nilai variabel total sampai berikutnya fungsi dipanggil. Tidak seperti statement return biasa, yang akan mengembalikan semua nilai sekaligus, generator akan melanjutkan dari yang terakhir diproses.
Di bawah ini adalah nilai-nilai berikutnya.
1 |
# generator_example.py
|
2 |
|
3 |
def myGenerator(l): |
4 |
total = 0 |
5 |
for n in l: |
6 |
yield total |
7 |
total += n |
8 |
|
9 |
|
10 |
newGenerator = myGenerator([10,20,30]) |
11 |
|
12 |
print(next(newGenerator)) |
13 |
print(next(newGenerator)) |
14 |
print(next(newGenerator)) |
15 |
|
16 |
# result
|
17 |
|
18 |
# 0
|
19 |
# 10
|
20 |
# 30
|
Jika kamu coba panggil fungsi setelah loop selesai, kamu akan mendapatkan error StopIteration.
StopIteration dilempar oleh fungsi next() untuk menandai bahwa tidak ada objek yang dihasilkan oleh iterator.
1 |
0 |
2 |
10 |
3 |
30 |
4 |
|
5 |
Traceback (most recent call last): |
6 |
File "python", line 15, in <module> |
7 |
StopIterationNormal function
|
Contoh 2
Pada contoh ini, kita akan lihat bagaimana cara menggunakan beberapa statement yield dalam sebuah fungsi.
1 |
# colors.py
|
2 |
|
3 |
def colors(): |
4 |
yield "red" |
5 |
yield "blue" |
6 |
yield "green" |
7 |
|
8 |
next_color =colors() |
9 |
|
10 |
print(next(next_color)) |
11 |
print(next(next_color)) |
12 |
print(next(next_color)) |
13 |
|
14 |
# result
|
15 |
|
16 |
# red
|
17 |
# blue
|
18 |
# green
|
Fungsi normal mengambalikan semua nilai saat fungsi tersebut dipanggil, sedangkan generator menunggu sampai fungsi next() dipanggil kembali. Begitu next() dipanggil, fungsi warna melanjutkan dari titik terakhir fungsi tersebut berhenti.
Kesimpulan
Generator sangat efisien dalam menggunakank memory, terutama saat berkerja dengan daftar atau objek yang sangat besar. Ini karena kamu bisa menggunakan yield untuk mengerjakan bagian lebih kecil dibanding menyimpan semua data dalam memory sekaligus.
Jangan lupa untuk melihat apa yang dijual dan bisa dipelajari pada Envato Market, dan jangan sungkan bertanya dan memberi kamu masukan dengan fitur komentar di bawah.
Selain itu, jika kamu merasa kesulitan, ada kursus tentang Python generator pada bagian course.



