Generators & yield — Python

Generators & yield Generator adalah fungsi spesial yang menghasilkan nilai satu per satu saat diminta, alih-alih menghitung semuanya sekaligus dan menyimpannya

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

Iterator Protocol Singkat

Generator otomatis mengimplementasikan iterator protocol — punya method __iter__ dan __next__. Makanya bisa langsung dipakai di for, sum(), list(), dll.

Yang akan kamu pelajari