Generators & yield
Generator adalah fungsi spesial yang menghasilkan nilai satu per satu saat diminta, alih-alih menghitung semuanya sekaligus dan menyimpannya di memory. Ini disebut lazy evaluation.
Fungsi Biasa vs Generator
# Fungsi biasa — kembalikan list sekaligus
def kotak_biasa(n):
hasil = []
for i in range(n):
hasil.append(i ** 2)
return hasil # semua nilai sudah dihitung
# Generator — pakai yield, kembalikan nilai satu per satu
def kotak_generator(n):
for i in range(n):
yield i ** 2 # "pause" di sini, lanjut saat diminta berikutnya
# Cara pakai
for x in kotak_generator(5):
print(x) # 0, 1, 4, 9, 16
Setiap kali yield dijalankan, fungsi berhenti sementara dan mengembalikan nilai. Saat iterasi berikutnya, eksekusi dilanjutkan tepat setelah yield.
Kenapa Pakai Generator? (Memory)
# Generator expression vs list comprehension
angka_list = [x ** 2 for x in range(10_000_000)] # ~80 MB di memory
angka_gen = (x ** 2 for x in range(10_000_000)) # ~200 byte!
# Hitung total — hasilnya sama, memory sangat berbeda
print(sum(angka_gen))
Untuk data besar atau file yang dibaca baris per baris, generator menghemat memory secara dramatis.
Generator Expression
Mirip list comprehension, tapi pakai tanda kurung bulat ():
genap = (x for x in range(20) if x % 2 == 0)
print(next(genap)) # 0
print(next(genap)) # 2
print(next(genap)) # 4
Infinite Sequence — Fibonacci
Generator cocok untuk urutan tak terbatas — karena nilai hanya dihitung saat diminta.
def fibonacci():
a, b = 0, 1
while True: # loop tak terbatas — aman karena lazy
yield a
a, b = b, a + b
gen = fibonacci()
for _ in range(10):
print(next(gen), end=" ")
# 0 1 1 2 3 5 8 13 21 34
Use Case Nyata
- Baca file besar —
for line in open("big.log"): ...(file object adalah generator) - Data pipeline — rangkai beberapa generator: filter → transform → aggregate tanpa bikin list perantara
- Streaming API — proses record yang datang satu per satu
- Infinite stream — angka prima, Fibonacci, timer, dll.
Iterator Protocol Singkat
Generator otomatis mengimplementasikan iterator protocol — punya method __iter__ dan __next__. Makanya bisa langsung dipakai di for, sum(), list(), dll.