İleri Düzey Fonksiyonlar | Bölüm 4

"İleri Düzey Fonksiyonlar | Bölüm 1" isimli yazıda, bir fonksiyonun aslında bir değişkene atanabileceğini görmüştük. Şimdi, işi biraz daha ileri götüreceğiz.

Normal şartlarda aşağıdaki gibi bir kullanım sağlarsanız fonksiyonun döndürdüğü sonucu değişkene atamış olursunuz.

toplaFonksiyonu = topla(3, 4) derken aslında topla() fonksiyonuna verdiğimiz değerler return edilip toplaFonksiyonu'na aktarılır. Ekranda da göreceğiniz üzere bu fonksiyon bana 7 sonucunu verdi çünkü zaten toplaFonksiyonu isimli değişken, topla() fonksiyonunun sonucunu tutuyor. Ancak biz, fonksiyonun kendisini bir değişkene atamak istersek bunu nasıl yaparız?

Bunu, toplaFonksiyonu = topla diyerek yapıyoruz. Dikkat ederseniz parantezler yok. Python'da bir fonksiyonu bir değişkene atarken parantez kullanırsanız yani toplaFonksiynu = topla() derseniz değişkene atanacak şey, fonksiyonun döndürdüğü değer olur. Ancak eğer parantez kullanmazsanız yani toplaFonksiyonu = topla derseniz değişkene atanacak şey, fonksiyonun tam olarak kendisi olur. Değişkeni, print(toplaFonksiyonu) diyerek yazdırdığımda çıktı kısmına bakarsanız bunun bir fonksiyon olduğunu söylediğini görürsünüz. Peki, bu durum bizim işimize nasıl yarayacak?

Aşağıdaki görüntüde bilmediğiniz hiçbir şey yok; buraya kadar her şey iyi ve normal.

Peki, madem mainFunction isimli fonksiyon bir operation argümanı alıyor, o zaman bunun değerini verelim. 

Burada, "eğer operation argümanının değeri "topla" ise addition fonksiyonunu döndür" demiş oldum. Ancak dikkat edelim; fonksiyonun döndürdüğü değeri değil; fonksiyonun kendisini döndürmesini istiyorum.

Şimdi, fonksiyona "topla" değerini verelim ve toplanacak rakamları yazalım.

Dikkat edelim; additionFunction isimli bir değişken oluşturdum ve ona mainFunction fonksiyonunu atadım. Anca bunu, "topla" değeri ile atadım. Yani yukarıdaki if koşulu her koşulda çalışacaktır.

Hemen altına bakarsanız print(additionFunction(2, 3)) dediğimi göreceksiniz. Önceden biz, şunu kullanıyorduk:

additionFunction = mainFunction(2, 3)

Ancak biraz önce return addition() yerine retrun addition dediğimiz için fonksiyonun kendisini değişkene atadık. Bu sayede artık direkt olarak fonksiyonun kendisine değer vermektense değişkene değer verebiliyoruz.

Bunu kanıtlamak adına verdiğimiz 2 ve 3 değerlerini silip kodu öyle çalıştıralım.

Gördüğünüz üzere bize şunu diyor: "x ve y adında iki argüman eksik". Fonksiyonun kendisini çağırdığımız için bu değerleri ona kendimiz vermek zorundayız. Peki, additionFunction isimli değişkene 2 ve 3 değerlerini yeniden verip bu sefer return addition değil de return addition() dersek ne olacak?

Aynı sorunu yaşadık. Burada biz, fonksiyonun kendisini değil de döndürdüğü değeri return ediyoruz. Ancak Python, toplanıp döndürülecek bir değer göremiyor.

Peki, bu olayları daha efektif bir şekilde kullanmayı öğrenelim. Örneğin ben, iki kişi tanımlayacağım ve bunların kullandığı programlama dillerini yazdıracağım.

mainFunction isimli fonksiyon name isimli bir argüman alırken progLang isimli fonksiyon prog isimli bir argüman alıyor. Sonrasında progLang içerisinde, return ile bu ikisini döndürüyorum.

Aşağı kısma bakarsanız return progLang() değil de return proglang dediğimi görürsünüz. Bu noktada biz, fonksiyonun döndürdüğü değeri değil, fonksiyonun kendisini döndürüyoruz.

Peki, sözüne ettiğim iki kişiyi de tanımlayalım.

Bu tanımlama şekli size bir yerden tanıdık gelmiş olmalı; class. OOP yapılarında yaptığımız gibi değişkenler atıyoruz ve bunlara, name argümanının değerini veriyoruz. Yani şu an, mainFunction isimli fonksiyonun gereksinimlerini karşıladık. Nasıl çalıştıracağız?

Sonuç harika. person1("Python") dediğim zaman biraz önce tanımladığım "Cyber" ismini aklında tutuyor ve verdiğim programlama dili argümanını bu isimle eşleştiriyor. Aynı şey, person2 için de geçerli.

Burada olan şeyi özetleyelim. person1 = mainFunction("Cyber") derken aslında mainFunction fonksiyonunun istediği name argümanının değerini vermiş oluyoruz. Burada sıkıntı yok; biliyorsunuz. Sonrasında verdiğimiz bu name değeri person1'e kaydediliyor.

person1("Python") dediğimizde ise Python, person1 içerisindeki "Cyber" ismi ile "Python" ifadesini birleştiriyor. Bunu, return progLang diyerek döndürdüğümüz fonksiyon sayesinde yapıyor. Fonksiyondaki kod satırlarının çalışma sırasına göre düşünecek olursak adımlar ise şu şekilde:

  • person1 ve person2, name argümanının karşılığıdır; birinci satır çalıştı.
  • person1("Python") ve person2("Bash") ise prog argümanının karşılığıdır; ikinci satır çalıştı.
  • Örneğin "Cyber, Python dilini kullanıyor" cümlesinin gereksinimleri, person1 = mainFunction("Cyber") ve person1("Python") komutları sayesinde bir ve ikinci satırda karşılandığı için progLang fonksiyonu return işlemini başarıyla tamamlıyor; üçüncü satır çalıştı.
  • return progLang ifadesiyle fonksiyonun kendisini döndürdüğümüz için bu fonksiyonun değerlerini direkt kendisine vermek yerine değişkenleri kullanarak verdik. Bu değerler de progLang fonksiyonunun gereksinimlerini karşıladığı için eşleşme tamamlandı ve istenen sonuç ekrana yazdırıldı.

Bakıldığında oldukça karmaşık göründüğünün farkındayım ama yapacak bir şey yok. Bu yapının, esnekliği ne derece artırdığını fark ettiğinizi umuyorum. Dolayısıyla bu yapıdan çekinmemeli ve defalarca pratik yaparak, hata alarak, hata çözerek öğrenmenizi ve anlamanızı istiyorum.


Yayınlanma Tarihi: 2022-12-31 16:01:51

Son Düzenleme Tarihi: 2023-01-02 19:56:55