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:
colors= [“red”,”blue”,”yellow”] def my_funct(): for color in colors: 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
d = {'x': 10, 'y': 20, 'z': 30} for k,v in d.items(): print k, v #result # y 20 # x 10 # z 30
Mengiterasi Baris dalam file CSV
import csv with open('file.csv', newline='') as File: reader = csv.reader(File) for row in reader: yield row
Mengiterasi String
my_string = 'Generators' for string in my_string: print (string) #result # G # e # n # e # r # a # t # o # r # 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.
class Reverse: """Iterator for looping over a sequence backwards.""" def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): return self def __next__(self): if self.index == 0: raise StopIteration self.index = self.index - 1 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.
def gen_function(): 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()
.
def myGenerator(l): total = 1 for n in l: yield total total += n newGenerator = myGenerator([10,3]) print(next(newGenerator)) print(next(newGenerator))
Bagaimana Generator Python Bekerja
Kita lihat bagaimana generator bekerja. Lihat contoh di bawah.
# generator_example.py def myGenerator(l): total = 0 for n in l: total += n yield total newGenerator = myGenerator([10,20,30]) print(next(newGenerator)) print(next(newGenerator)) print(next(newGenerator))
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.
# generator_example.py def myGenerator(l): total = 0 for n in l: yield total total += n newGenerator = myGenerator([10,20,30]) print(next(newGenerator)) print(next(newGenerator)) print(next(newGenerator)) # result # 0 # 10 # 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.
0 10 30 Traceback (most recent call last): File "python", line 15, in <module> StopIterationNormal function
Contoh 2
Pada contoh ini, kita akan lihat bagaimana cara menggunakan beberapa statement yield dalam sebuah fungsi.
# colors.py def colors(): yield "red" yield "blue" yield "green" next_color =colors() print(next(next_color)) print(next(next_color)) print(next(next_color)) # result # red # blue # 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.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weekly