Pythonda Nested (İç içe fonksiyonlar) da anlamadığım kısım

İstihza Python belgelerini okuyordum şuan ileri düzey fonksiyonlardayım ve şöyle bir örnek gördüm

def sayıcı():
    sayı = 0
    def say():
        nonlocal sayı
        sayı += 1
        return sayı
    return say

1.sorum
burada return say ve sayı derken neden parantez koymadık?
2.sorum
Bu fonksiyonu çağırırken eğer sayıcı() diye arka arkaya çağırırsak her seferinde sayıyı 1 1 1 olarak görüyorken neden s = sayıcı() yazıpta s() diye çağırınca 1 2 3 4 5 6 şeklinde görüyoruz yani
sayıcı()
ile
s = sayıcı()
s()
arasındaki fark nedir?

alttaki kodları çalıştırarak görebilirsiniz

def sayıcı():
    sayı = 0
    def say():
        nonlocal sayı
        sayı += 1
        return sayı
    return say()
for i in range(10):
    print(sayıcı())

bu üsttekinin sonucu 1 1 1 1 1 1 1 1 olarak çıkıyor
burda orjinal kodu return say() olarak değiştirdim

def sayıcı():
    sayı = 0
    def say():
        nonlocal sayı
        sayı += 1
        return sayı
    return say
s = sayıcı()
for i in range(10):
    print(s())

bunda ise 1 2 3 4 5 6 7 8 9 10 diye çıkıyor
burda return say parantez konmadan yazılmış zaten bu kodu python belgelerinden kopyaladım
etkileşimli kabuk kullanmadığımdan for döngüsünde 10 kere ekrana yazdırdım

kodu ctrl+e içinde atar mısın ? okunmuyor da.

Kodu ctrl+e içinde atarsanız daha rahat okuyup daha kolay cevap veririz

Kodu doğru attığınızdan emin misiniz ?
bence son return böyle olmalıydı return say()

Sen cevaplıyacak mısın cevaplayacaksan şuan teldeyim uğraşmıyacam cevaplamayacaksan uğraşayım

for sayıcı fonksiyonunu çalıştırıyo. sayı değişkeni 0 oluyo.
sonra return say() çalışıyo, sonra def say() çalışıyor ve sayı değişkenini nonlocal yapıyor. sonra sayı değişkenini 1 arttırıyor. artık sayı değişkeni 1. sonra for tekrar dönüyor ve sayı değişkeni gene 0. sonra tekrar say() fonksiyonu çalışıyor ve sayı 1 oluyor. böyle dönüyor. yani sayı hep 1 oluyor.

Diğerinde de aynı işlem oluyor. farkı üsttekinde for içinden sayıcı fonksiyonunu çağırdığı için sürekli 1 basıyor. alttakinde sayıcı fonksiyonunu s değişkenine atmış. dışardan çağırıyor. valla yazarak anlatması çok zor geldi… yazdım yazdım sildim. anlatabildim mi emin değilim :smiley:

def sayıcı():
    sayı = 0
    def say():
        nonlocal sayı
        sayı += 1
        return sayı
    return say
s = sayıcı()
for i in range(10):
    print(s())

parantezden kastınız hangisi
return (sayı)
return sayı()

s = sayıcı() ile ekrana basarken return sayı parantez kullanılmamış
benim yaptığım gibi sayıcı fonksiyonunu sayıcı() olarak çalıştırmak için return say() yapmam gerekti
return say() kısmından bahsediyorum

valla böle bi kod görmedim. büyük ihtimalle python2 den bi kalıntımı anlamadım. yani return say diyerek fonksiyon çağırılıyorsa bilmiyoruım

dışardan çalıştırmak ne demek bilmiyorum ama sonuçta s = sayıcı() dediğimizden her türlü sayıcı fonksiyonunun çalışması gerekmezmi dolayısıyla her seferinde sayının yeniden 0 a eşitlenmesi gerekir

Ben anladımda anlatmak çok zor telde.Biraz beklerseniz bilgisayara geçip anlatırım

güzel sorguluyosun da yazarak bunu anlatması zor geldi. nonlocal ne biliyosun demi?

nonlocal nested olan fonksiyonun içinde local bir sayı adlı değişken yerine kapsayıcı fonksiyon olan sayıcı fonksiyonunun sayı değişkenine müdahale ediyor diye biliyorum

Sayıcı fonksiyonunun içine print(“a”) yazdım. Üsttekinde for un içinden sayıcı fonksiyonunu çağırdığı için sayı değişkeni sürekli 0 oluyor ya alttakinde dışardan çağırdığı için. yani dışardan dediğim for un dışından çağırdığı için sürekli sayı değişkeni 0 olmuyor.

def sayıcı():
    sayı = 0
    print("a")
    def say():
        nonlocal sayı
        sayı += 1
        return sayı
    return say()
for i in range(10):
    print(sayıcı())

def sayıcı():
    sayı = 0
    print("a")
    def say():
        nonlocal sayı
        sayı += 1
        return sayı
    return say
s = sayıcı()
for i in range(10):
    print(s())

ayrıca nonlocal olayı tam bi saçmalık. başka dillerde hiç görmedim. global ve local kullanmak class nesne yapısına aykırı. nesne yönelimli programlama kullanırsan global local olayları gereksiz oluyo.


Parantez o fonksiyonun içini çalıştırıyor gibi düşünebilirsin

1 Beğeni


s = fonk() deyip
s() yazmak
fonk()() demekle aynı değilmi?
çünkü fonk() tek parantezle bir değer döndürmüyorsa s inde bir değeri olamaz
burda 1 değerini nasıl hafızada tutup fonkun içindeki ekleme fonksiyununu fonku çalıştırmadan çalıştırıyor onu anlayamıyorum.

dostum sen bu kodu nereye kadar anladın ?

def sayıcı():
    sayı = 0
    def say():
        nonlocal sayı
        sayı += 1
        return sayı
    return say
s = sayıcı()
for i in range(10):
    print(s())

s = sayici() diyene kadar

Bak çalışma sırasını yazayım.

  1. s = sayıcı() yapmış. s değişkeni artık sayıcı fonksiyonu ve içinde sayı = 0 değerini barındırıyor.
  2. for içinde print(s()) diyerek fonksiyonu çağırıyor. sayı hala 0.
  3. sonra return say çalışıyor ve sayı artık 1 oluyor.
  4. sayı artık 1 olduğu için. return sayı, say fonksiyonuna sayı=1 gönderiyor.
  5. say fonksiyonu return say a sayı=1 değerini gönderiyor.
  6. return say ise s = sayıcı() ya sayı=1 değerini gönderdi.

artık s = sayıcı() nın içindeki sayı değişkeni 1 oldu. sonra for tekrar çalışıyor.

for tekrar çalışırken s=sayıcı() nın içindeki sayı=1 i, return say a gönderiyor gene aynı şekilde geri dönüyor ve sayı 2 3 4 diye artıyor.

1 Beğeni