Fonksiyonlar sadece çağırıldıklarında çalışan bir kod bloğudurlar. Fonksiyonun çağırılması ifadesi, fonksiyona verilen ismin kodun bir bölümünde kullanılması anlamını taşımaktadır. Dilerseniz fonksiyonlara parametreler vasıtasıyla veri de göndererek içindeki kod bloğunda kullanılmasını sağlayabilirsiniz. Fonksiyonlar sonuç olarak bir  veri döndürürler.

Python’da bir fonksiyon oluşturmak için def anahtar kelimesi kullanılır;

def ilkFonksiyonum():
  print("İlk fonksiyonumuzu oluşturduk!")
# Fonksiyonumuzu çağırarak çalıştıralım
ilkFonksiyonum()

Çıktı:

İlk fonksiyonumuzu oluşturduk!

 

Parametreli Fonksiyonlar

Python’da parametre ifadesi yerine argüman ifadesiyle de karşılaşırsınız. Esasında aynı anlamı taşırlar ve fonksiyona veri gönderilmesini sağlayan yapılardır. Python’da args kısaltmasıyla karşılaştığınızda argüman(parametre) anlamını taşıdığını unutmayın.

Fonksiyonu tanımlarken kullandığınız parametre sayısı ile o fonksiyona çağrı yaparak çalıştırmak istediğinizde bu parametrelere gönderdiğiniz veri sayısı eşit olmalıdır. Aksi takdirde uygulama hata verir.

ilkSayi=input("Bir sayı giriniz: ")
ikinciSayi= input("İkinci sayıyı giriniz: ")
def toplama(ilkSayi,ikinciSayi):
  print("Sayıların toplamı: ", int(ilkSayi)+int(ikinciSayi))

toplama(ilkSayi,ikinciSayi)

Çıktı:

Bir sayı giriniz: 345
İkinci sayıyı giriniz: 988
Sayıların toplamı: 1333

 

Eğer parametreye bir ön tanımlı değer verirsek, kullanıcı parametre göndermeyi unuttuğunda bu varsayılan değer ile işlem gerçekleştirilir. Böylece fonksiyondaki parametreye veri gönderilmediği için hata vermesinin de önüne geçilmiş olur.

def selamlama(kisi="arkadaş!"):
  print("Merhaba " + kisi)

selamlama("Oben")
selamlama()

Çıktı:

Merhaba Oben
Merhaba arkadaş!

 

*args: Parametre Sayısı Bilinmediğinde

Eğer fonksiyonunuza kaç adet veri gönderileceğini bilmiyor iseniz, parametre adından önce bir yıldız * simgesi yerleştirerek fonksiyonu tanımlayabilirsiniz. Bu şekilde fonksiyon parametrelerden oluşan bir demet veri koleksiyonunu alabilir ve fonksiyon içinde bu demette yer alan verilere erişilerek kullanılabilir.

def toplama(*rakamlar):
  toplam=0
  for x in rakamlar:
    toplam += x
  print("Toplam: ", toplam)

toplama(34, 45, 3, 76)

Çıktı:

Toplam: 158

 

DeğişkenAdı=Değeri İkili Parametreleri

Fonksiyonları çalıştırmak üzere çağrı yaparken fonksiyon içinde işlenmek üzere göndermek istediğiniz parametreleri anahtar-değer ikilileri şeklinde de gönderebilirsiniz;

def personeller(personel3, personel2, personel1):
  print("Python deneyimli personelimiz: " + personel3)

personeller(personel1="Oben Seven", personel2="Mert Demir", personel3="Ceren Aydın")

Çıktı:

Python deneyimli personelimiz: Ceren Aydın

DeğişkenAdı=Değeri ifadelerini fonksiyona çağrı yaparken parametre olarak oluşturduğumuzda fonksiyona gönderiliş sırasının önemli olmadığına dikkat ediniz.

Ancak değişkenleri fonksiyon çağrısı içinde değil de daha önce oluşturursak, fonksiyona gönderiliş sırası sonucu değiştirir;

def personeller(personel3, personel2, personel1):
  print("Python deneyimli personelimiz: " + personel3)
personel1 = "Oben Seven"
personel2 = "Mert Demir"
personel3 = "Ceren Aydın"
personeller(personel1,personel2,personel3)

Çıktı:

Python deneyimli personelimiz: Oben Seven

 

**kwargs: Parametre Sayısı Bilinmediğinde

Eğer fonksiyonunuza kaç adet Değişken Adı=Değeri formatında parametre gönderileceğini bilmiyor iseniz, parametre adından önce iki yıldız ** simgesi yerleştirerek fonksiyonu tanımlayabilirsiniz. Bu şekilde fonksiyon parametrelerden oluşan bir sözlük veri koleksiyonunu alabilir ve fonksiyon içinde bu sözlükte yer alan verilere erişilerek kullanılabilir.

def personel_bilgileri(deneyim, bildigiDil, personelAd):
  print(personelAd + " isimli personel şu dili kullanıyor: " + bildigiDil)

personel_bilgileri(personelAd="Oben Seven", bildigiDil="Python", deneyim=18)

Çıktı:

Oben Seven isimli personel şu dili kullanıyor: Python

 

Parametre Veri Türleri

Fonksiyonunuza parametre olarak hangi türde veri(metin, sayısal, liste, demet, küme, sözlük) gönderirseniz fonksiyon içindeki kodlarda da o türdeki veriyi işlersiniz. Örneğin parametre oalrak bir liste gönderirseniz, fonksiyon içinde direkt liste işlemleri gerçekleştirebilirsiniz.

def listeyi_topla(listem):
  sonuc=0
  for x in listem:
    sonuc += x
  print("Listedeki sayıların toplamı: ", sonuc)

listem=[234,32,56,43]

listeyi_topla(listem)

Çıktı:

Listedeki sayıların toplamı: 365

Gördüğünüz gibi parametre olarak liste gönderdiğimiz için fonksiyon içinde bu listenin içindeki veriler için döngü kullanabiliyoruz.

 

Fonksiyonlardan bir veri döndürmek için de return anahtar kelimesi kullanılır. Örneğin yukarıdaki listede yer alan sayıların toplamını 2 ile çarpan bir işlem gerçekleştirmek isersek, bunu şuş ekilde yazabiliriz;

def listeyi_topla(listem):
  sonuc=0
  for x in listem:
    sonuc += x
  return sonuc

listem=[234,32,56,43]

print(listeyi_topla(listem)*2)

Çıktı:

730

 

Kendini Çağıran Fonksiyonlar(Recursion-Özyineleme)

Python’da bazı durumlarda fonksiyon içinde fonksiyonun kendisini çalıştırmanız gereken durumlarda ortaya çıkabilir. Python’da kendini çağıran fonksiyonları kullanabilirsiniz. Örneğin, kullanıcının yanlış bir veri girmesi durumunda doğru veriyi girmesi için fonksiyonu tekrar çalıştırmak üzere fonksiyon içinden çağırabilirsiniz. Bunu göstermek için pozitif iki sayıyı toplayan bir fonksiyon yazalım ve kullanıcı negatif bir değer verirse, pozitif sayı girmesini isteyelim;

def toplam():
  x=int(input("Bir rakam giriniz: "))
  y=int(input("Bir başka rakam daha giriniz: "))
  if x>0 and y>0:
    print("Girdiğiniz iki rakamın toplamı: ",x+y)
  else:
    print("Lütfen pozitif sayılar giriniz!")
    toplam()

toplam()

Çıktı:

Bir rakam giriniz: 5
Bir başka rakam daha giriniz: -6
Lütfen pozitif sayılar giriniz!
Bir rakam giriniz: 5
Bir başka rakam daha giriniz: 6
Girdiğiniz iki rakamın toplamı: 11

Burada, pozitif tamsayıların toplamını alan fonksiyonumuz var. Kullanıcıdan alınan veriler ile işlem yapıyor ve kullanıcı negatif sayı verirse else kod bloğu çalıştırılarak kullanıcıya pozitif tamsayı girmesi gerektiği söylenerek fonksiyon kendini çağırıp yeniden başlatıyor.

 

Bir başka örnek verecek olursak eğer, aşağıdaki faktöriyel hesabı yapan kodu inceleyebilirsiniz;

def faktoriyel(n):
  if n<0:
    print("Maalesef negatif bir sayı girdiniz!")
    faktoriyel(int(input("Pozitif bir sayı ile tekrar deneyiniz: ")))
  else:
    sonuc=1
    for x in range(n):
      sonuc *= (x+1)
    print(sonuc)

faktoriyel(int(input("Faktöriyelini hesaplamak istediğiniz rakamı giriniz: ")))

Çıktı:

Faktöriyelini hesaplamak istediğiniz rakamı giriniz: -4
Maalesef negatif bir sayı girdiniz!
Pozitif bir sayı ile tekrar deneyiniz: 5
120

 

Anonim Fonksiyonlar – Python Lambda

Lambda fonksiyonu Python’ın küçük bir anonim fonksiyonudur. Lambda fonksiyonu, istenilen sayıda parametre alır ama sadece tek bir ifade çalıştırır.

carpim = lambda a, b : a * b
print("Sonuç: ", carpim(4,5))

Çıktı:

Sonuç: 20

Lambda fonksiyonunun gücü, bir başka fonksiyon içinde anonim bir fonksiyon olarak kullandığınızda ortaya çıkar. Örneğin bir fonksiyonumuz olsun ve tek bir parametre alsın. Fonksiyon çağırılarak çalıştırılırken bu parametreye atanan değeri, lambda fonksiyonuna ait bilinmeyen bir başka parametre ile çarparak sonucu döndürsün.

def carpma(x):
  return lambda y : x * y

ikiyle_carp=carpma(2)
ucle_carp=carpma(3)

print(ikiyle_carp(18), ucle_carp(18))

Çıktı:

36 54