Generator dan yield
Fungsi yang menghasilkan nilai satu per satu, hemat memori.
Pahami konsepnya
Generator adalah fungsi yang memakai yield alih-alih return: setiap yield menghasilkan SATU nilai lalu menjeda eksekusi — state lokal (variabel, posisi) tetap terjaga. Saat elemen berikutnya diminta, eksekusi melanjutkan dari titik jeda itu. return mengakhiri generator.
Keunggulannya: LAZY. range(1_000_000) tidak menyimpan sejuta angka — ia menghasilkan satu per satu saat diminta. Generator expression (x**2 for x in range(10)) adalah comprehension tanpa kurung siku, menghasilkan iterator bukan list.
Use case: membaca berkas besar baris per baris tanpa memuat semuanya, pipeline transformasi data, dan infinite sequence (yield nilai berikutnya selamanya tanpa habis memori).
Coba contoh kode
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
for fib in fibonacci(8):
print(fib, end=" ") # 0 1 1 2 3 5 8 13
print()
# generator expression
kuadrat = (x**2 for x in range(5))
print(list(kuadrat))
print(sum(x**2 for x in range(10))) # tanpa list perantarayield a memberi nilai lalu MENJEDA — variabel a dan b tetap hidup antar pemanggilan. Generator expression di dalam sum() tidak membangun list perantara: angka dihitung dan dijumlahkan satu per satu.
Latihan singkat
Uji: list(fib(6)) harus `[0, 1, 1, 2, 3, 5]`.