Penutupan dalam Python

Yang dimaksud dengan penutupan (closure) adalah sebuah fungsi beserta semua variabel eksternal yang dapat diaksesnya.

Dalam Python, seringkali ketika menyebut "penutupan fungsi", yang dimaksud bukanlah fungsi itu sendiri, melainkan variabel eksternalnya.

Misalkan kita memiliki fungsi outer berikut, di mana variabel i dideklarasikan dan fungsi internal inner. Di dalamnya, i akan ditambah satu. Agar variabel i bekerja dengan benar, tambahkan pernyataan nonlocal padanya:

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

Sekarang mari kita letakkan fungsi eksternal ke dalam variabel res dan panggil dengan tanda kurung:

pythonres = outer()
res() # akan menampilkan 1

Mari kita panggil res beberapa kali. Setelah kode dijalankan, setiap kali penghitung i akan bertambah satu:

pythonres() # akan menampilkan 2
res() # akan menampilkan 3
res() # akan menampilkan 4

Namun, ada nuansa penting di sini - setiap pemanggilan fungsi outer akan menambah penghitungnya sendiri. Mari kita letakkan pemanggilan pertama outer ke dalam variabel res1, dan pemanggilan kedua - ke dalam variabel res2. Kemudian tampilkan secara berurutan ke konsol:

pythonres1 = outer()
res1() # akan menampilkan 1
res1() # akan menampilkan 2
res1() # akan menampilkan 3

res2 = outer()
res2() # akan menampilkan 1
res2() # akan menampilkan 2
res2() # akan menampilkan 3
Задание 1

Berikut adalah kode yang diberikan:

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

Jelaskan apa yang akan ditampilkan di konsol.

Задание 2

Buatlah sebuah fungsi, yang setiap pemanggilannya akan menghasilkan bilangan Fibonacci berikutnya.

Задание 3

Buatlah sebuah fungsi yang akan menghasilkan bilangan bulat acak dalam suatu rentang, tetapi dengan ketentuan tidak boleh ada angka yang sama dua kali berturut-turut.