İç içe Fonksiyonlar Üzerine

Merhaba , belgelerde aşağıdaki gibi bir kod vardır :

def yazıcı():
    def yaz(mesaj):
        print(mesaj)
    return yaz
 y = yazıcı()
 y("Merhaba")

Bir fonksiyonun çalışması için çağrılması gerekmez mi ? Yukarıdaki kodda def yaz() fonksiyonu çağırılmadığı halde iş görüyor. Ayrıca return yaz kısmınıda anlamadım. Bu kodu hiç anlamadım desem yeridir. Satır satır açılayabilecek var mı ? Vakit ayıranlara şimdiden teşekkür ederim.

şimdi pythonda şöyle bir durum var sen diyelim ki bir fonksiyon kodladın o fonksiyonu çalıştırmak için illa o fonksiyonun ismi ile çağrılmasına gerek yoktur.mesela o fonksiyonu bir değişkene atayıp onu sonra o değişkenin adını yazarak çağırabilirsin.hatta o değişkene bir () koyarak argumanlarını bile verebilirsin

1 Beğeni

Merhaba. Belgelerde bu kodun açıklaması zaten yapılmış, orayı okuyup da anlamadığınız kısım tam olarak ne?

   def yazıcı(): # burada fonksiyon adı yazılmış
       def yaz(mesaj): # sonrada o fonksiyonun içine yaz adında başka bir fonksiyon yazılmış
           print(mesaj) # ve o fonksiyonun içine mesaj argumanı yerine girilen şeyin yazılması print() fonksiyonu ile sağlanmış
       return yaz # ve o yaz adlı fonksiyon return ile çalıştırılıyor 
   y = yazıcı() # ve en önemli bölüm burada yazıcı fonksiyonunu y adında bir değişkene atıyor 
   y('merhaba') # ve burada y değişkeni yani dolaylı yoldan yazıcı() fonksiyonu çağırılıyor ve arguman olarak string şeklinde merhaba yazısı veriliyor ve ekranda merhaba yazıyor

ama eğer satır satır açıklama istiyorsan

1 Beğeni

acaba pythona yeni mi başladınız

1 Beğeni

Merhaba yorumunuz için teşekkür ederim. “yaz” isilmli fonksiyon “return yaz” komutu ile çağrılıyor dediğinize göre , doğru anladım mı ? Eğer öyleyse ilk defa gördüğüm bir şey "return yaz() " şeklinde olabilir diye düşünebilirdim ama parantezi görmeyince anlayamadım.

Yazdıklarınızın yarısı yanlış.

y = yazıcı()

Yukarıdaki satırda yazıcı isimli fonksiyon çağrıldı. yazıcı fonksiyonu yaz fonksiyonunun adresini geri döndürdüğü için, y değişkeninin değeri yaz fonksiyonu oldu.

y("Merhaba")

Yukarıdaki satır ile de yaz'a argüman verildi ve çağrıldı.

2 Beğeni

Merhaba yorumunuz için teşekkür ederim. " yazıcı fonksiyonumuz çağrıldığında değer olarak yaz fonksiyonunu çeviriyor." tam olarak bu kısım kafamı karıştırmıştı. Şimdi yavaş yavaş oturtuyorum diyebilirim. " return yaz" yerine " return yaz() " gibi bir şey bekliyordum.

ben bir tek return kısmından emin değilim

yaz fonksiyonun kendisi değer olarak döndürülüyor ve y değişkeni yaz fonksiyonuna eşit olmuş oluyor. return yaz ile return yaz() bambaşka şeyler, ikincisinde yaz fonksiyonu çalıştırılıyor ve dönüş değeri yazıcı fonksiyonu tarafından da döndürülüyor.

Son üç cümle yanlış.

3 Beğeni

Bu arada aşağıdaki fonksiyon da ekrana Merhaba yazısını yazdırır.

yazıcı()("Merhaba")

yazıcı() ile yazıcı fonksiyonunu çağırıyoruz. yazıcı()("Merhaba") ile de yazıcı isimli fonksiyonun return ettiği, yaz fonksiyonunu çağırıyoruz.

1 Beğeni

nasıl y değişkenini yazıcı değişkenine atanıyor cümlesi nasıl yanlış oluyor

Cevabınız için teşekkür ederim. Yani fonksiyonun sadece isim kısmı olan “yaz” return edilince fonksiyonun kendisi değer olarak dönüyor. "yaz () " olarak return edilirse fonksiyon çalışıp return edilen değeri return ediliyor. Doğru anlamış mıyım ?

Çünkü y değişkenine yazıcı değil, yazıcı’nın dönüş değeri olan fonksiyon atanıyor.

Evet.

1 Beğeni

ne fark var ki ben de orada bunu demek istedim

Ne demek istediğinizi bilmiyorum ama sizin dediğiniz ile benim dediğim arasında büyük fark var. Hem de aynı işi yapmayan iki farklı kod ile gösterilebilecek kadar büyük bir fark:

y = yazıcı # y değişkenine yazıcı fonksiyonu atanır
y = yazıcı("") # y değişkenine yazıcı fonksiyonunun dönüş değeri atanır

Son cümlenizden de zaten ilk kodu kastettiğiniz anlaşılıyor.

peki neyse siz beni çok yanlış anlamışsınız ama sorun yok sizi mi kıracağım alın çözüm sizindir.üç günlük dünya birbirimizi kırmayalım

2 Beğeni

bu arada konuyu sessize alıyorum

Ben de yanlis anladim cunku yazdigin sey yanlis :slight_smile:

Sorun da kirilmak degil, konuya yeni baslamis bir insana yanlis bilgi vermek.

Hatta normalde bu da sorun degil ama burada birbirine cok benzeyen iki sey arasindaki fark sorulmus. Bu soruyu cevaplarken bu iki seyden birini yazip digerini kasit etmek kafa karistiriyor.

@deneme.hesap371: Fonksiyonlari da 42 veya "hede" gibi degerlerden farksiz degerler olarak gormen isi kolaylastirabilir. Hatta fonksiyon cagrisini da deger uzerindeki __call__ methodunun cagrisi olarak dusunebilirsin:

>>> def foo():
...  print("42")
... 
>>> bar = "hede"
>>> foo
<function foo at 0x7f4f066664c0>
>>> bar
'hede'
>>> foo.__call__()
42
>>> bar.upper()
'HEDE'
4 Beğeni