Python - Closures: Panduan untuk Pemula
Halo yang menjadi programmer Python yang aspiratif! Hari ini, kita akan memulai perjalanan yang menarik ke dunia closures. Jangan khawatir jika Anda belum pernah mendengar istilah ini sebelumnya – sampai akhir tutorial ini, Anda tidak hanya akan mengerti apa itu closures tetapi juga akan dapat membuat dan menggunakannya di kode Anda sendiri. Jadi, mari kita mulai!
Apa itu Closure?
Bayangkan Anda memiliki sebuah kotak ajaib yang dapat mengingat hal-hal bahkan setelah Anda menutupnya. Itulah hampir sama dengan apa itu closures dalam pemrograman! Dalam Python, sebuah closure adalah sebuah objek fungsi yang mengingat nilai-nilai di lingkungan penutupnya bahkan jika mereka tidak ada di memori.
Terlalu membingungkan? Mari kita pecahkan:
- Itu adalah sebuah fungsi di dalam fungsi lain.
- Itu dapat mengakses variabel dari fungsi luar.
- Itu mengingat variabel ini bahkan saat fungsi luar telah selesai dieksekusi.
Pikirkan itu sebagai sebuah cara untuk membuat sebuah paket kecil dari fungsionalitas yang membawa data pribadinya sendiri. Keren, bukan?
Fungsi bersarang
Sebelum kita mendepani lebih jauh ke closures, mari kita berbicara tentang fungsi bersarang. Ini adalah fungsi yang didefinisikan di dalam fungsi lain. Berikut adalah contoh sederhana:
def fungsi_luar(x):
def fungsi_dalam(y):
return x + y
return fungsi_dalam
hasil = fungsi_luar(10)
print(hasil(5)) # Output: 15
Dalam contoh ini, fungsi_dalam
bersarang di dalam fungsi_luar
. Fungsi dalam dapat mengakses parameter x
dari fungsi luar. Ini adalah konsep utama untuk memahami closures.
Lingkup Variabel
Untuk benar-benar mengerti closures, kita perlu memahami lingkup variabel di Python. Ada tiga jenis lingkup:
- Lingkup lokal: Variabel yang didefinisikan di dalam fungsi
- Lingkup penutup: Variabel di dalam fungsi luar fungsi bersarang
- Lingkup global: Variabel yang didefinisikan di tingkat atas sebuah modul
Berikut adalah contoh untuk menggambarkan:
x = "Saya global!" # Lingkup global
def luar():
y = "Saya dari luar!" # Lingkup penutup
def dalam():
z = "Saya lokal!" # Lingkup lokal
print(x, y, z)
dalam()
luar()
Ketika Anda menjalankan kode ini, Anda akan melihat semua tiga variabel dicetak. Fungsi dalam
dapat mengakses variabel dari semua tiga lingkup!
Membuat Closure
Sekarang bahwa kita mengerti fungsi bersarang dan lingkup variabel, mari kita buat sebuah closure. Sebuah closure terjadi ketika sebuah fungsi bersarang mengacu pada nilai di lingkup penutupnya. Berikut adalah contoh:
def kali_dengan(n):
def pengali(x):
return x * n
return pengali
kali_dua = kali_dengan(2)
kali_tiga = kali_dengan(3)
print(kali_dua(5)) # Output: 10
print(kali_tiga(5)) # Output: 15
Dalam contoh ini, kali_dengan
adalah fungsi luar kami, dan pengali
adalah fungsi dalam kami. Magik terjadi ketika kita mengembalikan pengali
- itu mengingat nilai n
bahkan setelah kali_dengan
telah selesai dieksekusi. Ini adalah sebuah closure!
Mari kita pecahkan langkah demi langkah:
- Kita definisikan
kali_dengan
yang mengambil parametern
. - Di dalam
kali_dengan
, kita definisikanpengali
yang mengambil parameterx
. -
pengali
menggunakan keduax
(parameterunya sendiri) dann
(dari fungsi luar). - Kita mengembalikan
pengali
darikali_dengan
. - Ketika kita memanggil
kali_dengan(2)
, itu mengembalikan fungsi yang selalu mengkalikan inputnya dengan 2. - secara sama,
kali_dengan(3)
mengembalikan fungsi yang selalu mengkalikan inputnya dengan 3.
Ini adalah kekuatan closures - mereka dapat membuat fungsi spesialisasi pada saat itu!
Kata Kunci nonlocal
Terkadang, Anda mungkin ingin mengubah variabel dari lingkup penutup dalam fungsi dalam Anda. Python menyediakan kata kunci nonlocal
untuk tujuan ini. Berikut adalah contoh:
def penghitung():
count = 0
def tambah():
nonlocal count
count += 1
return count
return tambah
penghitung_saya = penghitung()
print(penghitung_saya()) # Output: 1
print(penghitung_saya()) # Output: 2
print(penghitung_saya()) # Output: 3
Dalam contoh ini, tambah
adalah sebuah closure yang mengingat dan mengubah variabel count
dari lingkup penutupnya. Kata kunci nonlocal
memberitahu Python bahwa count
bukan variabel lokal, tetapi salah satu dari lingkup penutup.
Penggunaan Praktis Closures
Closures tidak hanya trik keren - mereka memiliki aplikasi praktis! Berikut beberapa contohnya:
- Penyembunyian data dan enkapsulasi
- Membuat pabrik fungsi
- Implementasi dekorator
Mari kita lihat contoh dunia nyata. Bayangkan Anda membuat sistem diskon untuk toko online:
def buat_penyesuaian_harga(diskon):
def sesuaikan_harga(harga):
return harga * (1 - diskon)
return sesuaikan_harga
jual_beli_pagi = buat_penyesuaian_harga(0.2) # 20% off
jual_beli_sore = buat_penyesuaian_harga(0.15) # 15% off
harga_asli = 100
print(f"Harga Jual Beli Pagi: ${jual_beli_pagi(harga_asli)}")
print(f"Harga Jual Beli Sore: ${jual_beli_sore(harga_asli)}")
Kode ini membuat fungsi harga yang berbeda untuk acara penjualan yang berbeda, semua menggunakan fungsi dasar yang sama. Itulah kekuatan closures!
Ringkasan
Selamat! Anda baru saja belajar tentang salah satu fitur tingkat lanjut Python. Mari kita ulangi apa yang telah kita pelajari:
Konsep | Deskripsi |
---|---|
Closure | Sebuah fungsi yang mengingat nilai-nilai di lingkup penutup |
Fungsi Bersarang | Sebuah fungsi yang didefinisikan di dalam fungsi lain |
Lingkup Variabel | Visibilitas variabel (lokal, penutup, global) |
nonlocal |
Kata kunci untuk mengubah variabel di lingkup penutup |
Ingat, seperti setiap alat yang kuat, closures harus digunakan dengan bijak. Mereka hebat untuk tugas tertentu, tetapi penggunaannya berlebihan dapat membuat kode Anda lebih sulit dipahami. Latihan, eksperimen, dan segera Anda akan menggunakan closures seperti seorang pro Python!
Selamat coding, dan ingat - di Python, seperti dalam kehidupan, itu adalah apa yang ada di dalam (fungsi) yang menghitung!
Credits: Image by storyset