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!

Python - Closures

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:

  1. Itu adalah sebuah fungsi di dalam fungsi lain.
  2. Itu dapat mengakses variabel dari fungsi luar.
  3. 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:

  1. Lingkup lokal: Variabel yang didefinisikan di dalam fungsi
  2. Lingkup penutup: Variabel di dalam fungsi luar fungsi bersarang
  3. 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:

  1. Kita definisikan kali_dengan yang mengambil parameter n.
  2. Di dalam kali_dengan, kita definisikan pengali yang mengambil parameter x.
  3. pengali menggunakan kedua x (parameterunya sendiri) dan n (dari fungsi luar).
  4. Kita mengembalikan pengali dari kali_dengan.
  5. Ketika kita memanggil kali_dengan(2), itu mengembalikan fungsi yang selalu mengkalikan inputnya dengan 2.
  6. 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:

  1. Penyembunyian data dan enkapsulasi
  2. Membuat pabrik fungsi
  3. 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