Cevap yazıp yardımcı olan herkese teşekkür ederim.
Neden koyalim?
s
yerine sayici()
koyarak gorebiliriz:
sayici()()
Yani bu ikincisi, fonksiyonun dondurdugu fonksiyonu cagiriyor.
Goremiyoruz:
def sayıcı():
sayı = 0
def say():
nonlocal sayı
sayı += 1
return sayı
return say
print(sayıcı())
print(sayıcı())
print(sayıcı())
<function sayıcı.<locals>.say at 0x7f868f52ad40>
<function sayıcı.<locals>.say at 0x7f868f52ad40>
<function sayıcı.<locals>.say at 0x7f868f52ad40>
(bkz: Soru Sorarken Sıkça Düşülen Hatalar / #6)
Evet ama s = fonk()
deyip s(); s(); s()
yazmak ayni sey degil. fonk
1, dondurdugu 3 kere cagriliyor. fonk()(); fonk()(); fonk()()
yapinca fonk
3 kere, her dondurdugu de birer kere cagriliyor.
Soru veya tartisma esnasinda “tek parantezle” gibi (yanlis) terimler turetmek yerine hepimizin ortak dili olan python’u kullanirsak herkesin isi kolaylasir. Burada demeye calistiginiz sey fonk
’un sayi return etmemesi, print(fonk())
'un sayi yazmamasi mi?
s
’in bir degeri var. s
bir closure (calismasi yarim kalmis fonksiyon denebilir). Icinde her seyi tutabilir. Bu ornekte sayi
degiskenini tutuyor.
Kafamın karışmasına sebep olan şey closure dediğiniz şeyi bilmiyor olmammış onun ne iş yaptığını bilmeyince tabi s = fonk()
un anlamının sadece her seferinde uzun uzun fonk() fonk()
yazmaktansa kısaltma için s() s()
kullanıldığını zannediyordum ayrıca bugüne kadar fonksiyona ulasmak için parantez koyulmasının şart olduğunu sanıyordum şuan neyi bilmediğimi öğrendiğim için sıkıntı kalmadı
burada return say
yerine return say()
yazıp sayıcı()
olarak çağırınca 1 1 1 1 veriyor
Yardımcı olduğunuz için teşekkür ederim.