Fonksiyonlarda birkaç şeyi daha görmemiz gerekiyor. Ne kadar yol bilirsek o kadar iyi işler çıkarabiliriz. Bu yazıda, iç içe fonksiyonların nasıl tanımlandığını göreceğiz. Yavaştan girelim.
İlk önce ana yapımıza bir bakalım.

Gördüğünüz üzere def func1() dedikten sonra func1() fonksiyonunun içerisine girip func2() isminde yeni bir fonksiyon daha tanımladım. Bu noktada girinti sistemine dikkat ederseniz her şey sizin için daha kolay olacaktır.
Peki, bu iki fonksiyon bize bir şeyler yazdırsın.

Kutucukların renklerine dikkat ederek hangi return ifadesinin hangi fonksiyona ait olduğunu görebilirsiniz. En aşağıda print(func1()) şeklinde, func1() fonksiyonunun çalışmasını sağladım ama çıktı kısmına dikkat ederseniz yalnızca func1()'e ait return ifadesinin çalıştığını görürsünüz. Neden böyle oldu? Neden func2() fonksiyonu da işini yapmadı?
Burada devreye tam anlamıyla Scope (Kapsama alanı) giriyor. func2() fonksiyonu, func1() fonksiyonuna ait olduğu için func2() fonksiyonuna yalnızca func1() fonksiyonu içerisindeyken erişebilirsiniz. İsterseniz ilk önce fonksiyonların dışına print(func2()) diyelim ve ne olacağını görelim.

func2() fonksiyonunu dışarıda çalıştırırsak altı çizilecek ve bize NameError hatası verecektir. Diyor ki: "func2 tanımlı değil". O zaman ben bunu func1() fonksiyonunun içinde olacak şekilde çalıştırırsam sorun olmaması gerekiyor. Bakalım.

Dikkat edelim; func2() içerisinde değil, func1() içerisinde çalıştırıyorum. Eğer func1() içerisinde başka bir fonksiyonunuz varsa o fonksiyonun içinde de çalıştırabilirsiniz.
Çıktı kısmına da bakarsanız ikisinin de çalıştığını görürsünüz. Ancak ilk önce func2() çalışmış. Bunun sebebi, ilk önce return "func2() çalışıyor" kodunun geliyor olmasıdır. Eğer ilk önce func1()'in yanıt vermesini isterseniz şu şekilde bir kullanım sağlayabilirsiniz.

Bu şekilde bir işlem yapmak mümkündür. Ancak ana fonksiyonumuz olan func1() None değer döndürdü. Bu, return kullanmadığımız için oldu. Yalnız, dikkatli olalım; eğer return ifadesini başa koyarsanız sonrasında kodlarını çalışmaz. Örneğin;

Dikkat ederseniz print() yerine return kullandım ve return ifadesinin altındaki kodlar silikleşti. Ayrıca çıktı kısmında da yalnızca func1()'e ait return ifadesinin çalıştığını görüyorsunuz. Hatırlayacağınız üzere return ifadelerinden sonra gelen kodlar çalışmıyordu.
Peki, iç içe fonksiyonlar daha çok nasıl kullanılır?

Bir sürü fonksiyon tamamlarsınız; sonrasında başarıyla tamamlanırsa "ana fonksiyon başarıyla tamamlandı" dersiniz. İşte, genel anlamda bu yapının kullanım alanı bu şekildedir. Ufak bir örnek daha verelim. Örneğin yine birkaç tane fonksiyonumuz olsun.

Dikkat ederseniz ana fonksiyon dışındaki her fonksiyonu try: ile denedim. Zaten try: içerisinde hata almazsak except bloklarına hiç girmeyecektir; kodumuz başarılı olmuştur. Bu yüzden try: dedikten ve komutları verdikten sonra return diyebilirsiniz. Eğer bir hata yakalanırsa zaten except bloklarına gireceği için return ifadesi çalışmayacaktır.
Şimdi, daha gerçekçi ama basit bir şeyler yapalım.

Kodu inceleyebilirsiniz. Bu kod içerisinde hem iç içe fonksiyon tanımlamayı, hem de iç içe fonksiyonların içinde başka bir fonksiyonu çağırmayı göreceksiniz.
Ana fonksiyonumuza da argüman verebiliyoruz. Örneğin *args kullanalım.

mainFunction isimli fonksiyona *args argümanını verdim. Fonksiyonun içerisine de toplama işlemi yapan bir fonksiyon yazdım ama aldığı argüman result. Buradaki result, args ile ilişkisi olan ve toplama işleminin saklanacağı değişkendir. addition() fonksiyonunun dışına çıkıp return addition(args) diyerek addition() fonksiyonunun sonucunu döndürdüm.
Bu noktada return addition(result) derseniz hata alacaksınızdır. Çünkü bir eşleştirme söz konusu olmayacaktır. Biz, return addition(args) derken aslında return addition(result=args) demiş oluyoruz. Yani addition() içerisindeki result argümanı, değerini mainFunction içerisinde verdiğimiz args ifadesinden alıyor. Sonrasında args için de değer vermemiz gerektiği için en dış tarafa print(mainFunction(1,2,3,4,5)) şeklinde bir kod girdim. Sonuç olarak 1,2,3,4,5 değerleri args argümanına gidiyor, args argümanı bu değerleri result argümanına veriyor ve sum() fonksiyonu, result içerisindeki bu değerleri topluyor.
Bu kısmı anlamanız biraz zor olabilir; defalarca okumaktan ve pratik yaparak nasıl çalıştığını anlamaktan çekinmeyin. Eğer aklınız hâlâ karışıksa bana veya Telegram üyelerine erişebilirsiniz.
Genel yapımız bu şekildeydi. Bir sonraki bölümde görüşmek üzere.
Yayınlanma Tarihi: 2022-12-31 14:31:25
Son Düzenleme Tarihi: 2023-01-02 19:56:42