Untuk memahami konsep closure di python kita harus mengetahui apa itu fungsi bersarang dan variabel non-lokal. Jadi mari kita mulai dengan mereka terlebih dahulu
Fungsi bersarang dan variabel Non-lokal
Ketika suatu fungsi didefinisikan di dalam fungsi lain maka ini disebut fungsi bersarang, di mana, fungsi di mana fungsi lain didefinisikan disebut fungsi luar dan fungsi yang didefinisikan di dalam fungsi lain disebut fungsi dalam. Contoh yang menggambarkan penggunaan fungsi bersarang ditunjukkan di bawah ini
#defining nested function def outer(message): #text is having the scope of outer function text = message def inner(): #using non-local variable text print(text) #calling inner function inner() # main method if __name__=='__main__': outer('Hello!')Halo
Dalam cuplikan kode di atas, fungsi dalam inner() dapat mengakses variabel lokal text dari fungsi luar outer() yang memiliki cakupan yang meluas hingga ke seluruh tubuh fungsi outer(). Variabel lokal text dari fungsi luar adalah variabel non-lokal untuk fungsi dalam yang dapat diakses tetapi tidak dapat dimodifikasi
Memahami konsep penutupan
Penutupan adalah objek fungsi (fungsi yang berperilaku seperti objek) yang mengingat nilai dalam lingkup terlampir bahkan jika tidak ada dalam memori
Ketika suatu fungsi tersedia di dalam fungsi lain maka penutupan dibuat. Fungsi dalam akan memiliki akses ke variabel dan parameter fungsi luar bahkan setelah fungsi luar dikembalikan. Ini berarti kita dapat memanggil fungsi dalam nanti dan itu akan memiliki akses ke variabel dan parameter fungsi luar. Sebenarnya, penutupan mengacu pada variabel dan parameter fungsi luar. Dapat dikatakan bahwa closure adalah record yang menyimpan fungsi bersama dengan lingkungan
#defining nested function def outer(message): #text is having the scope of outer function text = message def inner(): #using non-local variable text print(text) #return inner function return inner # main method if __name__=='__main__': func = outer('Hello!') func()_Halo
Dalam contoh di atas, kami telah menggunakan penutupan untuk mengakses fungsi inner() di luar cakupannya, karena fungsi inner() hanya tersedia di dalam fungsi outer() tetapi dengan mengembalikannya, kami dapat mengaksesnya di luar fungsi outer()
Kemudian dalam metode utama, kita telah memanggil fungsi outer() dan mengembalikan referensi fungsi inner() ke variabel #defining nested function def outer(message): #text is having the scope of outer function text = message def inner(): #using non-local variable text print(text) #return inner function return inner # main method if __name__=='__main__': func = outer('Hello!') func()3
Sekarang, variabel #defining nested function def outer(message): #text is having the scope of outer function text = message def inner(): #using non-local variable text print(text) #return inner function return inner # main method if __name__=='__main__': func = outer('Hello!') func()_3 memiliki referensi ke fungsi inner() yang berarti ketika kita menggunakan tanda kurung dengan variabel #defining nested function def outer(message): #text is having the scope of outer function text = message def inner(): #using non-local variable text print(text) #return inner function return inner # main method if __name__=='__main__': func = outer('Hello!') func()3 maka ia berfungsi sebagai fungsi inner() yang mengakses variabel text dari fungsi outer() yang dipanggil pada saat deklarasi variabel #defining nested function def outer(message): #text is having the scope of outer function text = message def inner(): #using non-local variable text print(text) #return inner function return inner # main method if __name__=='__main__': func = outer('Hello!') func()3
Mari kita ambil satu contoh lagi
Contoh ini sedikit lebih rumit, karena di sini kita telah menggunakan argumen di dalam fungsi inner()1. Jadi, ketika fungsi inner()_2 dipanggil, ia mengembalikan referensi ke fungsi inner()1
Dan saat mendefinisikan variabel inner()_4, inner()5 dan inner()6, kami telah melewati nilai argumen inner()7 setiap kali
Oleh karena itu, variabel inner()4, inner()5 dan inner()6 mengacu pada fungsi inner()1 dengan nilai argumen inner()7 masing-masing ditetapkan sebagai 1, 5 dan 9
Dan kemudian saat memanggil fungsi inner()1 menggunakan variabel inner()4, inner()5 dan inner()6, kami juga telah memberikan nilai text7 dan karenanya mendapatkan hasil yang diinginkan
Poin Penting untuk Diingat tentang Penutupan
Berikut adalah beberapa poin berguna yang juga membentuk kondisi yang diperlukan untuk mengimplementasikan penutupan di python