/blog/*

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.