Lompat ke konten Lompat ke sidebar Lompat ke footer

Memahami Python Closures

Bahasa pemrograman Python menyediakan berbagai fitur yang memungkinkan programmer menyusun kode secara terstruktur, efisien, dan mudah dikembangkan. Salah satu fitur yang menarik untuk dipelajari adalah *closure*. Konsep ini berkaitan erat dengan fungsi bertingkat, ruang lingkup variabel, serta kemampuan suatu fungsi untuk tetap mengakses variabel dari fungsi lain meskipun fungsi tersebut telah selesai dijalankan. Pemahaman terhadap closure menjadi penting ketika mempelajari pemrograman Python tingkat lanjut, khususnya dalam pembuatan fungsi yang fleksibel dan dapat menyimpan keadaan tertentu.

Sebelum mempelajari materi tentang cara Memahami Python Closures, terlebih dahulu pelajari materi tentang: Memahami Iterator dalam Python, Mengenal Generator dalam Python, dan Memahami Namespace dan Scope Variabel dalam Python.

Dalam pemrograman dasar, fungsi biasanya dibuat untuk menerima masukan, melakukan pengolahan, kemudian menghasilkan keluaran. Variabel yang didefinisikan di dalam fungsi umumnya digunakan selama pelaksanaan fungsi tersebut. Setelah fungsi selesai dijalankan, variabel lokalnya tidak dapat diakses secara langsung dari luar fungsi. Namun, Python memiliki mekanisme yang memungkinkan sebuah fungsi bagian dalam tetap mengakses variabel dari fungsi luar, bahkan setelah fungsi luar selesai dijalankan. Mekanisme inilah yang menjadi dasar terbentuknya closure.

Closure tidak sekadar berkaitan dengan fungsi yang didefinisikan di dalam fungsi lain. Konsep ini juga berhubungan dengan kemampuan fungsi bagian dalam mempertahankan akses terhadap lingkungan variabel yang melingkupinya. Kemampuan tersebut dapat dimanfaatkan untuk membuat fungsi dengan perilaku khusus, menyimpan nilai tanpa menggunakan variabel global, membatasi akses terhadap data, dan membangun fungsi yang dapat digunakan kembali dengan parameter yang berbeda.

Materi Python Closures menjelaskan bahwa closure merupakan fungsi bertingkat yang dapat mengakses variabel dari fungsi luar meskipun fungsi luar tersebut telah selesai dijalankan. Pembahasan berikut menguraikan konsep tersebut secara bertahap, mulai dari pengertian fungsi bertingkat hingga contoh penerapan closure dalam berbagai situasi pemrograman.

Pengertian Closure dalam Python

Closure adalah fungsi yang mempertahankan akses terhadap variabel dari lingkungan fungsi luar yang melingkupinya, meskipun pelaksanaan fungsi luar tersebut telah selesai. Dalam Python, closure umumnya terbentuk ketika sebuah fungsi bagian dalam merujuk pada variabel dari fungsi luar dan fungsi bagian dalam tersebut dikembalikan atau tetap digunakan setelah fungsi luar selesai dijalankan.

Untuk memahami konsep ini, perlu diketahui bahwa fungsi dalam Python merupakan objek. Artinya, fungsi dapat disimpan dalam variabel, diteruskan sebagai argumen kepada fungsi lain, dan dikembalikan sebagai hasil dari pemanggilan fungsi. Kemampuan tersebut memungkinkan sebuah fungsi dibuat di dalam fungsi lain, kemudian dikembalikan agar dapat dipanggil pada waktu berikutnya.

Perhatikan contoh berikut:
def sapa():
nama = "Andi"
def tampilkan_nama():
print("Halo,", nama)
tampilkan_nama()
sapa()


Hasil program:
Halo, Andi

Pada contoh tersebut, fungsi `tampilkan_nama()` didefinisikan di dalam fungsi `sapa()`. Variabel `nama` didefinisikan pada fungsi luar, tetapi dapat digunakan oleh fungsi bagian dalam. Hal ini terjadi karena fungsi bagian dalam dapat mengakses variabel yang berada dalam lingkungan fungsi luar.

Contoh tersebut memperlihatkan fungsi bertingkat, tetapi belum menunjukkan karakteristik closure secara lengkap karena fungsi bagian dalam masih dipanggil ketika fungsi luar sedang berjalan. 

Untuk melihat sifat closure secara lebih jelas, fungsi bagian dalam dapat dikembalikan oleh fungsi luar, kemudian dipanggil setelah fungsi luar selesai dijalankan:
def sapa():
nama = "Andi"
def tampilkan_nama():
print("Halo,", nama)
return tampilkan_nama
pesan = sapa()
pesan()


Hasil program:
Halo, Andi

Ketika `sapa()` dipanggil, fungsi tersebut mengembalikan objek fungsi `tampilkan_nama`. Objek fungsi itu disimpan dalam variabel `pesan`. Setelah pemanggilan `sapa()` selesai, `pesan()` tetap dapat mengakses variabel `nama` yang berasal dari fungsi luar.

Kemampuan mempertahankan akses tersebut merupakan ciri utama closure. Variabel `nama` tidak perlu dijadikan variabel global dan tidak perlu dikirimkan kembali sebagai argumen ketika `pesan()` dipanggil. Informasi yang dibutuhkan telah dipertahankan melalui lingkungan yang terkait dengan fungsi bagian dalam.

Memahami Fungsi Bertingkat (*Nested Function*)

Fungsi bertingkat adalah fungsi yang didefinisikan di dalam fungsi lainnya. Dalam Python, fungsi bertingkat dapat digunakan untuk memisahkan pekerjaan menjadi bagian-bagian yang lebih kecil, membatasi penggunaan fungsi pembantu, dan mengatur hubungan antara fungsi dengan variabel yang berada di sekitarnya.

Sebagai contoh, perhatikan kode berikut:
def salam(nama):
def tampilkan():
print("Selamat datang,", nama)
tampilkan()
salam("Rina")


Hasil program:
Selamat datang, Rina

Fungsi `salam()` merupakan fungsi luar, sedangkan `tampilkan()` merupakan fungsi bagian dalam. Parameter `nama` diterima oleh fungsi luar dan digunakan oleh fungsi bagian dalam. Dengan cara ini, fungsi bagian dalam tidak perlu menerima parameter tambahan untuk memperoleh nama yang sudah tersedia dalam lingkungan fungsi luar.

Fungsi bertingkat memiliki beberapa kegunaan. Pertama, fungsi tersebut dapat menjadi fungsi pembantu yang hanya diperlukan oleh fungsi luar. Kedua, fungsi bertingkat dapat membantu mengelompokkan proses yang saling berkaitan. Ketiga, fungsi bertingkat dapat menjadi dasar pembentukan closure ketika fungsi bagian dalam perlu tetap digunakan setelah fungsi luar selesai dijalankan.

Meskipun demikian, tidak setiap fungsi bertingkat otomatis menjadi closure dalam pengertian yang umum digunakan. Karakteristik penting closure adalah adanya fungsi yang mempertahankan akses terhadap variabel dari lingkungan luar yang melingkupinya. Oleh karena itu, hubungan antara fungsi bagian dalam dan variabel yang digunakannya perlu diperhatikan ketika mempelajari konsep ini.

Cara Kerja Closure dalam Python

Closure bekerja melalui hubungan antara objek fungsi bagian dalam dan variabel dari lingkungan fungsi luar. Ketika fungsi bagian dalam menggunakan variabel dari fungsi luar, Python dapat mempertahankan akses terhadap variabel tersebut selama masih diperlukan oleh fungsi bagian dalam.

Perhatikan contoh berikut:
def buat_pesan():
pesan = "Belajar Python dengan tekun"
def tampilkan_pesan():
return pesan
return tampilkan_pesan
fungsi_pesan = buat_pesan()
print(fungsi_pesan())


Hasil program:
Belajar Python dengan tekun

Proses pelaksanaan kode tersebut dapat dijelaskan melalui beberapa tahap.
  • Pertama, Python mendefinisikan fungsi `buat_pesan()`. Fungsi tersebut memiliki variabel lokal bernama `pesan` dan fungsi bagian dalam bernama `tampilkan_pesan()`.
  • Kedua, ketika `buat_pesan()` dipanggil, variabel `pesan` memperoleh nilai `"Belajar Python dengan tekun"`. Pada saat yang sama, fungsi bagian dalam didefinisikan dan merujuk pada variabel tersebut.
  • Ketiga, pernyataan `return tampilkan_pesan` mengembalikan objek fungsi bagian dalam, bukan hasil pemanggilan fungsi itu. Objek fungsi tersebut kemudian disimpan dalam variabel `fungsi_pesan`.
  • Keempat, fungsi luar selesai dijalankan. Meskipun demikian, `fungsi_pesan()` tetap dapat mengakses nilai `pesan` ketika dipanggil. Python mempertahankan lingkungan yang diperlukan oleh fungsi bagian dalam agar referensi terhadap variabel tersebut tetap tersedia.
  • Kelima, ketika `fungsi_pesan()` dijalankan, fungsi tersebut mengembalikan teks yang tersimpan pada variabel `pesan`.

Contoh tersebut menunjukkan bahwa closure memungkinkan fungsi membawa konteks tertentu dari lingkungan pembentukannya. Dengan demikian, fungsi tidak hanya berisi serangkaian instruksi, tetapi juga dapat mempertahankan akses terhadap data yang diperlukan untuk menjalankan instruksi tersebut.

Perbedaan Fungsi Biasa dan Closure

Fungsi biasa dan closure sama-sama dapat menerima masukan, melakukan pengolahan, serta menghasilkan keluaran. Perbedaan utamanya terletak pada hubungan fungsi dengan lingkungan variabel yang melingkupinya.

Fungsi biasa umumnya menggunakan parameter, variabel lokal, dan variabel lain yang dapat diakses berdasarkan aturan scope. Closure memiliki karakteristik tambahan, yaitu mempertahankan akses terhadap variabel dari lingkungan fungsi luar yang melingkupinya meskipun fungsi luar telah selesai dijalankan.

Perbedaan tersebut dapat dilihat pada tabel berikut:

Aspek


Fungsi Biasa


Closure


  • Bentuk umum

  • Dapat didefinisikan pada tingkat modul atau di dalam fungsi lain.

  • Umumnya berupa fungsi bagian dalam yang mempertahankan akses terhadap variabel dari fungsi luar.

  • Akses variabel

  • Menggunakan parameter, variabel lokal, dan nama lain yang dapat dijangkau sesuai aturan ruang lingkup.

  • Dapat mengakses variabel dari lingkungan fungsi luar yang melingkupinya.

  • Setelah fungsi luar selesai

  • Tidak selalu berkaitan dengan fungsi luar.

  • Tetap dapat mengakses variabel luar yang dipertahankan dalam closure.

  • Penyimpanan konteks

  • Biasanya menggunakan parameter atau keadaan lain yang tersedia.

  • Mempertahankan akses terhadap variabel yang dirujuk dari lingkungan luar.

  • Penggunaan

  • Perhitungan, pengolahan data, dan berbagai tugas umum.

  • Membuat fungsi khusus, menyimpan konteks, dan menghasilkan fungsi dengan konfigurasi tertentu.

  • Contoh

  • Fungsi penjumlahan dua bilangan, seperti def tambah(a, b): return a + b.

  • Fungsi pengali yang mempertahankan faktor pengali tertentu, seperti buat_pengali(3).


Perbedaan ini tidak berarti closure merupakan jenis objek yang sepenuhnya terpisah dari fungsi. Closure tetap merupakan objek fungsi dalam Python. Istilah closure digunakan untuk menjelaskan fungsi yang memiliki hubungan dengan variabel dari lingkungan luar yang melingkupinya.


Contoh Closure untuk Menghasilkan Bilangan Ganjil

Salah satu contoh yang digunakan dalam pembahasan closure adalah membuat fungsi yang menghasilkan bilangan ganjil secara bertahap. Contoh ini memperlihatkan bagaimana closure dapat mempertahankan nilai variabel dan mengubahnya setiap kali fungsi bagian dalam dipanggil.
def hitung_ganjil():
angka = 1
def angka_berikutnya():
nonlocal angka
angka += 2
return angka
return angka_berikutnya
ganjil = hitung_ganjil()
print(ganjil())
print(ganjil())
print(ganjil())


Hasil program:
3
5
7


Fungsi `hitung_ganjil()` memiliki variabel `angka` yang dimulai dari nilai `1`. Di dalam fungsi tersebut, terdapat fungsi `angka_berikutnya()` yang menambahkan nilai `angka` sebesar `2` setiap kali dipanggil.

Kata kunci `nonlocal` digunakan untuk menyatakan bahwa nama `angka` yang ditetapkan ulang merujuk pada variabel di lingkungan fungsi luar yang melingkupi fungsi bagian dalam. Tanpa `nonlocal`, penetapan nilai terhadap `angka` di dalam `angka_berikutnya()` akan diperlakukan sebagai penetapan nama lokal dan tidak dapat mengubah variabel `angka` milik fungsi luar.

Ketika `hitung_ganjil()` dipanggil, fungsi tersebut mengembalikan objek fungsi `angka_berikutnya`. Objek tersebut disimpan dalam variabel `ganjil`. Selanjutnya, setiap pemanggilan `ganjil()` menggunakan nilai `angka` yang dipertahankan oleh closure.

Pemanggilan pertama menghasilkan `3`, pemanggilan kedua menghasilkan `5`, dan pemanggilan ketiga menghasilkan `7`. Nilai tersebut bertambah secara bertahap karena closure mempertahankan keadaan variabel yang digunakan.

Jika fungsi luar dipanggil kembali, closure baru akan terbentuk dengan lingkungan variabelnya sendiri.
def hitung_ganjil():
angka = 1

def angka_berikutnya():
nonlocal angka
angka += 2
return angka

return angka_berikutnya
ganjil_pertama = hitung_ganjil()

print(ganjil_pertama())
print(ganjil_pertama())

ganjil_kedua = hitung_ganjil()
print(ganjil_kedua())


Hasil program:
3
5
3


Variabel `ganjil_pertama` dan `ganjil_kedua` merujuk pada dua objek fungsi yang terbentuk dari pemanggilan `hitung_ganjil()` yang berbeda. Masing-masing closure mempertahankan variabel `angka` sendiri. Karena itu, pemanggilan `ganjil_kedua()` dimulai kembali dari keadaan awal dan menghasilkan `3`.

Contoh tersebut memperlihatkan bahwa closure dapat digunakan untuk menyimpan keadaan yang terpisah pada setiap fungsi yang dihasilkan.

Menggunakan Closure untuk Membuat Fungsi Pengali

Closure juga dapat digunakan untuk membuat fungsi dengan perilaku khusus berdasarkan nilai yang diberikan sebelumnya. Salah satu penerapannya adalah membuat fungsi pengali yang mempertahankan faktor pengali tertentu.

Perhatikan kode berikut:
def buat_pengali(faktor):
def kalikan(angka):
return angka * faktor
return kalikan

kali_tiga = buat_pengali(3)
kali_lima = buat_pengali(5)

print(kali_tiga(9))
print(kali_lima(3))
print(kali_lima(kali_tiga(2)))


Hasil program:
27
15
30


Fungsi `buat_pengali()` menerima parameter `faktor`. Di dalamnya, fungsi `kalikan()` menggunakan parameter `angka` untuk menghitung hasil perkalian dengan `faktor`.

Ketika `buat_pengali(3)` dipanggil, fungsi tersebut menghasilkan closure yang mempertahankan faktor pengali `3`. Objek fungsi itu disimpan dalam variabel `kali_tiga`. Demikian pula, pemanggilan `buat_pengali(5)` menghasilkan closure lain yang mempertahankan faktor pengali `5` dan disimpan dalam variabel `kali_lima`.

Ketika `kali_tiga(9)` dipanggil, nilai `9` dikalikan dengan faktor `3`, sehingga hasilnya `27`. Sementara itu, `kali_lima(3)` menghasilkan `15` karena faktor yang dipertahankan adalah `5`.

Pada pemanggilan terakhir, `kali_tiga(2)` menghasilkan `6`, kemudian nilai tersebut diteruskan ke `kali_lima()`. Hasil akhirnya adalah `30`. Contoh ini memperlihatkan bahwa closure dapat membentuk beberapa fungsi dengan perilaku berbeda berdasarkan parameter yang diberikan ketika fungsi luar dipanggil.

Pendekatan tersebut bermanfaat ketika programmer membutuhkan sejumlah fungsi yang memiliki pola kerja serupa, tetapi menggunakan konfigurasi berbeda. Daripada menulis fungsi terpisah untuk setiap faktor pengali, satu fungsi pembentuk dapat digunakan untuk menghasilkan fungsi-fungsi yang diperlukan.

Manfaat Closure dalam Pemrograman Python

Closure memiliki sejumlah manfaat yang membuatnya berguna dalam pengembangan program. Salah satu manfaat utamanya adalah mengurangi ketergantungan terhadap variabel global. Informasi yang dibutuhkan oleh sebuah fungsi dapat disimpan dalam lingkungan fungsi luar dan diakses melalui closure. Dengan demikian, programmer tidak harus selalu menempatkan informasi tersebut pada tingkat global.

Manfaat berikutnya adalah memungkinkan penyimpanan konteks. Sebuah closure dapat mempertahankan nilai yang diberikan saat fungsi luar dipanggil. Nilai tersebut dapat digunakan pada pemanggilan fungsi bagian dalam berikutnya tanpa harus selalu dikirimkan sebagai argumen. Contohnya terlihat pada fungsi pengali yang mempertahankan faktor tertentu.

Closure juga mendukung pembatasan akses terhadap data. Variabel yang digunakan oleh closure tidak harus tersedia sebagai variabel global yang dapat diakses langsung oleh seluruh bagian program. Informasi tersebut dapat tetap berada dalam lingkungan fungsi luar, sementara bagian program lain hanya berinteraksi melalui fungsi yang dikembalikan.

Selain itu, closure dapat meningkatkan penggunaan kembali kode. Sebuah fungsi pembentuk dapat menghasilkan beberapa fungsi dengan perilaku berbeda berdasarkan parameter. Cara ini mengurangi pengulangan definisi fungsi dan membuat kode lebih ringkas ketika sejumlah fungsi mempunyai pola kerja yang sama.

Closure juga berperan dalam pembuatan dekorator (*decorator*) Python. Dekorator merupakan mekanisme untuk membungkus atau memperluas perilaku fungsi tanpa harus mengubah isi fungsi aslinya secara langsung. Banyak dekorator memanfaatkan fungsi bertingkat dan closure untuk mempertahankan akses terhadap fungsi yang dibungkus maupun konfigurasi tertentu.

Meskipun memiliki manfaat, closure tidak selalu menjadi pilihan terbaik untuk setiap persoalan. Jika sebuah program membutuhkan banyak data dan metode yang saling berkaitan, penggunaan kelas dapat memberikan struktur yang lebih jelas. Pemilihan antara closure dan kelas sebaiknya mempertimbangkan kompleksitas program, jumlah keadaan yang perlu disimpan, serta kemudahan pemeliharaan kode.

Penerapan Closure untuk Menghitung Diskon

Untuk memahami penerapan closure dalam situasi yang lebih dekat dengan kebutuhan sehari-hari, konsep ini dapat digunakan untuk membuat fungsi penghitung harga setelah diskon. Fungsi luar menyimpan persentase diskon, sedangkan fungsi bagian dalam menghitung harga akhir berdasarkan harga awal yang diberikan.
def buat_penghitung_diskon(persen):
def hitung(harga):
potongan = harga * persen / 100
return harga - potongan

return hitung

diskon_10 = buat_penghitung_diskon(10)
diskon_20 = buat_penghitung_diskon(20)

print(diskon_10(100000))
print(diskon_20(100000))


Hasil program:
90000.0
80000.0


Fungsi `buat_penghitung_diskon()` menerima parameter `persen` sebagai besaran diskon. Fungsi bagian dalam bernama `hitung()` menggunakan nilai tersebut untuk menghitung potongan harga dan menguranginya dari harga awal.

Ketika `buat_penghitung_diskon(10)` dipanggil, closure yang dihasilkan mempertahankan persentase diskon sebesar sepuluh persen. Sementara itu, `buat_penghitung_diskon(20)` menghasilkan closure yang mempertahankan persentase diskon sebesar dua puluh persen.

Kedua fungsi dapat digunakan berulang kali untuk menghitung harga produk yang berbeda. Programmer tidak perlu menuliskan ulang rumus diskon untuk setiap persentase. Cukup dengan membuat closure baru menggunakan nilai persentase yang diperlukan, fungsi penghitung harga dapat digunakan sesuai kebutuhan.

Contoh tersebut memperlihatkan bahwa closure tidak hanya berguna untuk latihan konsep, tetapi juga dapat membantu membangun fungsi yang lebih praktis dan mudah digunakan kembali. Untuk aplikasi nyata, pengolahan nilai uang dapat memerlukan tipe `Decimal` agar perhitungan desimal mengikuti aturan ketelitian yang diharapkan.

Memeriksa Closure dengan Atribut `__closure__`

Python menyediakan atribut `__closure__` pada objek fungsi untuk memeriksa sel yang menyimpan referensi terhadap variabel dari lingkungan luar. Jika suatu fungsi merupakan closure yang memiliki variabel bebas yang dipertahankan, atribut tersebut dapat berisi tuple yang terdiri atas objek sel.

Contoh berikut memperlihatkan cara sederhana memeriksa closure:
def buat_pengali(faktor):
def kalikan(angka):
return angka * faktor

return kalikan
kali_tiga = buat_pengali(3)

print(kali_tiga(4))
print(kali_tiga.__closure__[0].cell_contents)


Hasil program:
12
3


Pemanggilan `kali_tiga(4)` menghasilkan `12` karena angka `4` dikalikan dengan faktor `3`. Sementara itu, ekspresi `kali_tiga.__closure__[0].cell_contents` memperlihatkan isi sel yang menyimpan nilai `faktor` yang dirujuk oleh closure.

Perlu diperhatikan bahwa akses melalui indeks tertentu pada `__closure__` hanya sesuai untuk contoh sederhana yang diketahui memiliki satu variabel bebas. Fungsi yang memiliki beberapa variabel bebas dapat mempunyai beberapa sel. 

Untuk pemeriksaan yang lebih umum, programmer dapat menggunakan atribut `__code__.co_freevars` untuk melihat nama variabel bebas yang dirujuk oleh fungsi.
def buat_pesan(nama, sapaan):
def tampilkan():
return f"{sapaan}, {nama}"

return tampilkan
pesan = buat_pesan("Rina", "Selamat pagi")

print(pesan())
print(pesan.__code__.co_freevars)


Hasil program:
Selamat pagi, Rina
('nama', 'sapaan')


Contoh ini memperlihatkan bahwa fungsi `tampilkan()` menggunakan dua variabel dari lingkungan luar, yaitu `nama` dan `sapaan`. Kedua nama tersebut menjadi variabel bebas bagi fungsi bagian dalam. Informasi ini berguna ketika mempelajari bagaimana Python menghubungkan fungsi dengan lingkungan variabel yang dibutuhkannya.

Atribut `__closure__` dan `co_freevars` lebih sering digunakan untuk pemeriksaan dan pembelajaran konsep internal fungsi daripada untuk kebutuhan program sehari-hari. Dalam sebagian besar aplikasi, programmer cukup memahami perilaku closure tanpa harus memeriksa atribut tersebut secara langsung.

Kesalahan yang Perlu Dihindari ketika Menggunakan Closure

Salah satu kesalahan yang sering terjadi adalah mengembalikan hasil pemanggilan fungsi bagian dalam, bukan objek fungsinya. Perbedaan antara `return kalikan` dan `return kalikan()` sangat penting. Pernyataan `return kalikan` mengembalikan objek fungsi sehingga fungsi itu dapat dipanggil kemudian. Sebaliknya, `return kalikan()` langsung menjalankan fungsi `kalikan()` pada saat fungsi luar dipanggil dan mengembalikan hasilnya.

Kesalahan lain adalah mengubah variabel dari fungsi luar tanpa menggunakan `nonlocal` ketika penetapan ulang memang ditujukan pada variabel tersebut. Jika fungsi bagian dalam perlu mengubah nilai variabel yang didefinisikan pada fungsi luar, deklarasi `nonlocal` biasanya diperlukan. Tanpa deklarasi tersebut, Python akan memperlakukan nama yang ditetapkan ulang sebagai nama lokal fungsi bagian dalam.

Programmer juga perlu memahami bahwa closure yang berbeda dapat mempertahankan keadaan yang berbeda. Apabila fungsi pembentuk dipanggil beberapa kali, setiap pemanggilan dapat menghasilkan lingkungan closure tersendiri. Karena itu, jangan menganggap bahwa perubahan pada satu closure otomatis mengubah variabel yang dipertahankan oleh closure lainnya.

Selain itu, penggunaan closure secara berlebihan dapat membuat kode lebih sulit dibaca, terutama ketika terdapat banyak fungsi bertingkat dan variabel dari berbagai lingkungan. Jika logika program membutuhkan banyak atribut, proses perubahan data yang kompleks, dan banyak metode yang bekerja pada data yang sama, kelas mungkin menjadi pilihan yang lebih sesuai.

Praktik yang baik adalah membuat fungsi pembentuk dengan tujuan yang jelas, menggunakan nama variabel yang mudah dipahami, serta membatasi kompleksitas fungsi bagian dalam. Dengan cara tersebut, closure dapat dimanfaatkan tanpa mengurangi keterbacaan dan kemudahan pemeliharaan program.

Kesimpulan

Closure merupakan konsep dalam Python yang memungkinkan sebuah fungsi mempertahankan akses terhadap variabel dari lingkungan fungsi luar yang melingkupinya, meskipun fungsi luar telah selesai dijalankan. Konsep ini berkaitan erat dengan fungsi bertingkat, scope variabel, serta kemampuan fungsi diperlakukan sebagai objek yang dapat disimpan, dikembalikan, dan dipanggil kembali.

Melalui closure, programmer dapat membentuk fungsi yang mempertahankan konteks tertentu, seperti faktor pengali, persentase diskon, atau nilai yang berubah secara bertahap. Closure juga dapat mengurangi ketergantungan terhadap variabel global, mendukung pembatasan akses terhadap data, serta membantu menghasilkan fungsi yang dapat digunakan kembali dengan konfigurasi berbeda.

Kata kunci `nonlocal` dapat digunakan ketika fungsi bagian dalam perlu menetapkan ulang variabel yang berada pada fungsi luar yang melingkupinya. Sementara itu, atribut `__closure__` dapat membantu memeriksa variabel yang dipertahankan oleh objek fungsi dalam konteks pembelajaran dan penelusuran program.

Meskipun closure memiliki berbagai manfaat, penggunaannya tetap perlu disesuaikan dengan kebutuhan. Untuk fungsi sederhana yang perlu mempertahankan sedikit konteks, closure dapat menjadi pilihan yang ringkas dan efektif. Untuk struktur data dan perilaku yang lebih kompleks, kelas mungkin memberikan organisasi yang lebih jelas. Dengan memahami cara kerja, manfaat, dan batasannya, programmer dapat menggunakan closure secara tepat untuk membangun program Python yang lebih fleksibel, terstruktur, dan mudah dikembangkan.

Artikel ini akan dibaca oleh: Febrian Restu Andhika, Firza Tegar Febrian, Gadis Lolalita, Gustaf Bintang Prayoga, dan Hanik Arifah.

8 komentar untuk "Memahami Python Closures"

  1. Jangan main saham kalo modal yang kamu miliki belum cukup, atau tidak siap mengalami kerugian.

    BalasHapus
    Balasan
    1. Menurut saya faktor penting dalam berinvestasi itu bukanlah modal ataupun kesiapan mengalami rugi, karena sebagian besar orang yang berinvestasi tidak ada yang ingin mengalami rugi atau kehilangan uangnya.

      Ketimbang melakukan kenekatan untuk menempatkan modal pada bidang investasi yang tidak diketahui, jauh lebih penting untuk mempelajari dasar-dasar dari kegiatan investasi terlebih dahulu.

      Hapus
    2. Setuju, kebanyakan orang-orang yang mengalami kerugian dalam investasi saham adalah mereka yang tidak suka membaca atau tidak suka mencari informasi, dan lebih pada pemahaman tentang kepraktisan dalam menempatkan uangnya pada suatu bidang investasi tertentu tanpa perlu berpikir secara rumit.

      Hapus
  2. Salah satu persepsi yang sering disalah pahami oleh para investor pemula, utama investor dibidang saham adalah mereka tidak perlu bersusa payah dalam menempatkan uang mereka pada suatu instrumen investasi tertentu pada pasar bursa, dan hanya terfokus pada grafik nilai penjualan saham, tanpa mengetahui perkembangan ekonomi secara makro dan juga pasar global.

    Padahal hal yang paling mempengaruhi perkembangan harga saham adalah faktor-faktor yang berasal dari ekonomi makro tersebut.

    BalasHapus
  3. Saya adalah seorang investor saham yang sudah memiliki pengalaman investasi kurang lebih 10 tahun, satu hal yang saya selalu tekankan dalam berinvestasi saham adalah saya tidak pernah menginvestasikan uang yang saya miliki tersebut untuk mendapatkan keuntungan, tetapi hanya sekadar untuk menjaga nilai uang yang saya miliki tersebut untuk tetap berada di nilai inflasi saat ini, dan jika nilai uang yang saya investasikan pada saham saat ini telah berada diatas nilai ekspektasi yang saya harapkan sebelumnya, saya cuma menganggapnya sebagai rejeki tambahan saja.

    BalasHapus
    Balasan
    1. Lantas dari mana sumber keuntungan yang bisa didapatkan jika berinvestasi saham hanya dianggap sebagai sarana untuk mempertahankan nilai uang yang dimiliki atau cuma sebagai alat tabungan saja?

      Hapus
    2. Dengan cara bekerja di salah satu perusahaan dan mendapatkan uang atau penghasilan dari pekerjaan yang dilakukan tersebut, dimana sebagian penghasilan tersebut saya simpan di beberapa instrumen investasi, yang salah satunya adalah saham, dan sisanya saya gunakan sebagai modal untuk membuka usaha sendiri.

      Hapus
  4. Klo modal ente untuk investasi saham masih sedikit, ga usah terlalu banyak berharap bakal dapat untuk besar atau bakal dapat pasif income, cuma bikin capek aja, mending modal yang udah ada dipake buat usaha aja.

    BalasHapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -