Penutupan dalam Python
Penutupan (closure) merujuk kepada fungsi bersama-sama dengan semua pembolehubah luaran yang boleh diaksesnya.
Dalam Python, paling kerap, apabila menyebut "penutupan fungsi", yang dimaksudkan bukanlah fungsi itu sendiri, tetapi tepatnya pembolehubah luaran tersebut.
Katakan kita mempunyai fungsi outer berikut,
di mana pembolehubah i diisytiharkan dan
fungsi dalaman inner. Di dalamnya,
satu akan ditambah kepada i. Untuk
memastikan pembolehubah i berfungsi dengan betul,
kita tambahkan arahan nonlocal kepadanya:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Sekarang mari letakkan fungsi luaran ke dalam
pembolehubah res dan panggilnya dengan
tanda kurung:
res = outer()
res() # akan mengeluarkan 1
Mari panggil res beberapa kali.
Selepas melaksanakan kod, pembilang
i akan meningkat satu demi satu setiap kali:
res() # akan mengeluarkan 2
res() # akan mengeluarkan 3
res() # akan mengeluarkan 4
Walau bagaimanapun, terdapat nuansa penting di sini - setiap
panggilan fungsi outer akan meningkatkan
pembilangnya sendiri. Mari letakkan panggilan pertama outer
ke dalam pembolehubah res1, dan panggilan kedua
- ke dalam pembolehubah res2. Kemudian
keluarkan mereka ke konsol secara berurutan:
res1 = outer()
res1() # akan mengeluarkan 1
res1() # akan mengeluarkan 2
res1() # akan mengeluarkan 3
res2 = outer()
res2() # akan mengeluarkan 1
res2() # akan mengeluarkan 2
res2() # akan mengeluarkan 3
Diberi kod berikut:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Beritahu, apa yang akan dikeluarkan ke konsol.
Buat fungsi, setiap panggilannya akan memanggil nombor Fibonacci berikutnya.
Buat fungsi yang akan memberikan nombor integer rawak dalam julat, tetapi supaya tidak ada yang sama dua kali berturut-turut.