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:
def 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:
res = outer()
res() # 1 yazdırır
res'i birkaç kez çağıralım.
Kod her çalıştıktan sonra i sayacı
bir birim artacak:
res() # 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:
res1 = 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
Aşağıdaki kod verilmiştir:
def 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.
Her çağrıldığında bir sonraki Fibonacci sayısını verecek bir fonksiyon yapın.
Bir aralıkta rastgele bir tamsayı verecek, ancak arka arkaya iki kez aynı sayının gelmeyeceği bir fonksiyon yapın.