Python'da Closure'lar

Closure (closure) terimiyle, bir fonksiyonun erişebildiği tüm dış değişkenlerle birlikte ifade edilmesi kastedilir.

Python'da "fonksiyon closure'ı" denildiğinde, çoğunlukla fonksiyonun kendisinden değil, tam olarak onun dış değişkenlerinden bahsedilir.

Diyelim ki içinde i değişkeninin tanımlandığı ve iç fonksiyon inner'ın olduğu aşağıdaki outer fonksiyonumuz var. Bu fonksiyonda i'ye bir eklenir. i değişkeninin doğru çalışması için, nonlocal ifadesini ekliyoruz:

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

Şimdi dış fonksiyonu res değişkenine atayalım ve parantezlerle çağıralım:

pythonres = outer()
res() # 1 yazdırır

res'i birkaç kez çağıralım. Kod her çalıştıktan sonra i sayacı bir birim artacak:

pythonres() # 2 yazdırır
res() # 3 yazdırır
res() # 4 yazdırır

Ancak burada önemli bir nüans var - outer fonksiyonunun her çağrılışı kendi sayacını artıracaktır. İlk outer çağrısını res1 değişkenine, ikinci çağrıyı ise res2 değişkenine atayalım. Ardından bunları sırayla konsola yazdıralım:

pythonres1 = outer()
res1() # 1 yazdırır
res1() # 2 yazdırır
res1() # 3 yazdırır

res2 = outer()
res2() # 1 yazdırır
res2() # 2 yazdırır
res2() # 3 yazdırır
Задание 1

Aşağıdaki kod verilmiştir:

pythondef outer():
  i = 10

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

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

Konsola ne yazdırılacağını söyleyin.

Задание 2

Her çağrıldığında bir sonraki Fibonacci sayısını verecek bir fonksiyon yapın.

Задание 3

Bir aralıkta rastgele bir tamsayı verecek, ancak arka arkaya iki kez aynı sayının gelmeyeceği bir fonksiyon yapın.