Python - Generators: Pengenalan Lembut untuk Pemula

Halo there, pemrogram Python yang berambisi! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia Python Generators. Jangan khawatir jika Anda belum pernah mendengar tentang mereka sebelumnya – kita akan memulai dari awal dan bergerak ke atas. Pada akhir tutorial ini, Anda akan membuat generators seperti seorang pro!

Python - Generators

Apa itu Python Generators?

Bayangkan Anda membaca sebuah buku yang sangat panjang. Alih-alih menyalin seluruh buku sekaligus (yang akan menghabiskan banyak kertas!), Anda bisa saja membaca satu halaman pada satu waktu. Itulah seperti cara kerja generators di Python!

Generators adalah jenis fungsi khusus yang memungkinkan kita untuk menghasilkan urutan nilai secara bertahap, bukannya menghitung mereka semua sekaligus dan menyimpan mereka di memori. Mereka seperti pabrik penyihir yang menghasilkan nilai sesuai permintaan.

Mengapa Menggunakan Generators?

  1. Kecerdasan Memori: Generators ramah terhadap memori. Mereka tidak menyimpan semua nilai di memori secara bersamaan.
  2. Performa: Mereka dapat meningkatkan performa kode Anda, khususnya saat menghadapi dataset yang besar.
  3. Kegembiraan: Generators dapat membuat kode Anda lebih bersih dan lebih mudah dibaca.

Mari kita melompat dan lihat bagaimana mereka bekerja!

Membuat Generators

Ada dua cara utama untuk membuat generators di Python:

  1. Menggunakan fungsi generator
  2. Menggunakan ekspresi generator

Fungsi Generator

Fungsi generator terlihat seperti fungsi normal, tetapi bukannya menggunakan kata kunci return, itu menggunakan yield. Ini adalah contoh sederhana:

def count_up_to(n):
i = 1
while i <= n:
yield i
i += 1

# Menggunakan generator kami
for number in count_up_to(5):
print(number)

Output:

1
2
3
4
5

Dalam contoh ini, count_up_to adalah sebuah fungsi generator. Setiap kali itu menghasilkan nilai, itu menunda eksekusi dan mengingatkan keadaannya. Pada waktu berikutnya itu dipanggil, itu melanjutkan dari tempat itu meninggalkan.

Ekspresi Generator

Ekspresi generator seperti komprehensi daftar, tapi dengan tanda kurung bukannya tanda kurung siku. Mereka adalah cara ringkas untuk membuat generators. Ini adalah contoh:

# Ekspresi generator
squares = (x**2 for x in range(5))

# Menggunakan generator kami
for square in squares:
print(square)

Output:

0
1
4
9
16

Ekspresi generator ini membuat urutan angka kuadrat secara langsung, tanpa menyimpan mereka semua di memori sekaligus.

Pengendalian Exception di Generators

Generators juga dapat menangani exception, yang sangat keren! Ini adalah contoh:

def div_generator(a, b):
try:
result = a / b
yield result
except ZeroDivisionError:
yield "Tidak dapat membagi oleh nol!"

# Menggunakan generator kami
g = div_generator(10, 2)
print(next(g))  # Cetak: 5.0

g = div_generator(10, 0)
print(next(g))  # Cetak: Tidak dapat membagi oleh nol!

Dalam contoh ini, generator kita dengan lembut menangani kasus di mana kita mencoba untuk membagi oleh nol.

Fungsi Normal vs Fungsi Generator

Mari kita bandingkan fungsi normal dengan fungsi generator untuk melihat perbedaannya:

# Fungsi normal
def get_squares(n):
squares = []
for i in range(n):
squares.append(i**2)
return squares

# Fungsi generator
def gen_squares(n):
for i in range(n):
yield i**2

# Menggunakan fungsi normal
print(get_squares(5))  # Cetak: [0, 1, 4, 9, 16]

# Menggunakan fungsi generator
for square in gen_squares(5):
print(square)  # Cetak setiap kotak pada baris baru

Perbedaan utama adalah:

  1. Penggunaan memori: Fungsi normal membuat dan menyimpan semua nilai sekaligus, sementara generator menghasilkan mereka satu persatu.
  2. Sintaks: Fungsi normal menggunakan return, sementara generator menggunakan yield.
  3. Iterasi: Generator dapat diiterasi secara langsung, sementara hasil fungsi normal perlu disimpan di variabel terlebih dahulu.

Generators Asinkron

Python 3.6 memperkenalkan generators asinkron, yang seperti generators reguler tapi untuk pemrograman asinkron. Mereka menggunakan async def dan yield:

import asyncio

async def async_gen():
for i in range(3):
await asyncio.sleep(1)
yield i

async def main():
async for item in async_gen():
print(item)

asyncio.run(main())

Contoh ini mensimulasikan operasi asinkron yang menghasilkan nilai secara bertahap.

Metode Generators

Generators memiliki beberapa metode khusus yang dapat sangat berguna. Ini adalah tabel dari yang paling umum:

Metode Deskripsi
next() Mengambil item berikutnya dari generator
send() Mengirim nilai ke generator
throw() Mengirim exception di dalam generator
close() Menutup generator

Ini adalah contoh cepat menggunakan send():

def echo_generator():
while True:
received = yield
print(f"Received: {received}")

g = echo_generator()
next(g)  # Prime the generator
g.send("Hello")  # Cetak: Received: Hello
g.send("World")  # Cetak: Received: World

Dan itu saja! Anda baru saja mengambil langkah pertama Anda ke dunia yang menakjubkan Python Generators. Ingat, praktek membuat perfect, jadi jangan takut untuk bereksperimen dengan konsep ini. Sebelum Anda sadar, Anda akan menggunakan generators untuk mengatasi berbagai macam masalah yang menarik dalam program Python Anda. Happy coding!

Credits: Image by storyset