Konsep Generator pada Python
Singkatnya Generator pada Python merupakan cara sederhana membuat sebuah Iterator. Namun sebelum memahami konsep generator, kita harus paham dulu mengenai apa itu Iterables.
Iterables
Iterables merupakan suatu object dimana pada object itu kita bisa melakukan suatu proses iterasi atau looping, object akan mengembalikan satu nilai per satu waktu. Secara teknis, object dikatakan Iterables jika mengimplementasikan 2 function __iter__()
dan __next__()
. Berikut contoh membuat object Iterables:
class Counter:
def __init__(self, low, high):
self.current = low - 1
self.high = high
def __iter__(self):
return self
def __next__(self):
self.current += 1
if self.current < self.high:
return self.current
raise StopIteration
for c in Counter(1, 10):
print(c)
Bagaimana Loop Bekerja?
for n in myList:
# loop body
Ketika anda melihat suatu loop seperti diatas, dibelakang layar loop for
menciptakan object iterator dengan memanggil function __iter__()
. Selanjutnya didalam loop, function __next__()
akan terus dipanggil untuk mendapatkan nilai berikutnya hingga setelah semua item habis, exception StopIteration
akan muncul untuk menandai berakhirnya loop tersebut.
Generator
Ketika anda ingin membuat suatu object Iterables ada banyak code overhead yang perlu dibuat seperti __iter()
dan __next__()
, kemudian juga harus membangkitkan eksepsi StopIteration
pada saat tidak ada lagi item yang tersedia. Hal diatas dapat dihandle secara otomatis dengan menggunakan Generator.
Generator merupakan suatu function yang akan mengembalikan sebuah object iterator. Suatu function generator ditandai dengan adanya keyword yield. yield
maupun return
akan mengembalikan suatu nilai dari suatu function. Perbedaannya adalah jika return
akan menghentikan(terminate) function secara keseluruhan, sementara yield
hanya akan menghentikan sementara(pause) function dan menyimpan semua state variable yang ada didalamnya untuk nantinya bisa dilanjutkan kebali dari state tersebut.
def my_generator(n):
print('FIRST')
yield n
print('SECOND')
yield n + 1
print('THIRD')
yield n + 2
g = my_generator(1)
print(next(g))
print(next(g))
print(next(g))
# Output
FIRST
1
SECOND
2
THIRD
3
Satu hal yang perlu diperhatikan dari contoh diatas adalah nilai n
selalu diingat disetiap pemanggilan function. Selain itu, object generator hanya bisa diiterasi untuk sekali saja. Kita harus membuat object generator baru untuk melakukan iterasi kembali.