Genel Tekrar
10.2 Fonksiyonların Parametreleri
Bir önceki bölümde fonksiyonları parametrelerle birlikte kullanarak epey esnek sonuçlar elde edebilece˘gimizi görmü¸stük. Bu arada, bizim burada “parametre” olarak adlandırdı˘gımız ¸sey bazı yerlerde “argüman” olarak da kar¸sınıza çıkabilir. Bu iki terim özünde birbirinden farklı olsa da, ço˘gunlukla fonksiyonlar için birbiriyle e¸s anlamlı olarak kullanılmaktadır... Yani fonksiyonlar söz konusu oldu˘gunda “parametre” ve “argüman” aynı ¸seyi ifade eder. Peki “argüman” ile
“parametre” arasındaki fark nedir?
¸
Su örnekte “x” bir parametredir:
def fonk(x):
¸
Su örnekte ise “50” bir argümandır:
fonk(50)
Yani bir fonksiyonun tanımlanması sırasında, parantez içinde belirtilen de˘gi¸skenlere “parame-tre” adı verilirken, tanımlanan fonksiyonun ça˘grılması esnasında, bu de˘gi¸skenlere verilen
de˘gerlere ise “argüman” adı veriliyor. Dolayısıyla yukarıdaki fonksiyon hakkında ¸söyle bir cümle kurabiliriz:
“fonk” adlı fonksiyonun x parametresine argüman olarak 50 de˘gerini verdik...
Ancak “parametre” ile “argüman” arasındaki bu farklılık ço˘gu zaman gözardı edilir ve bu iki kavram ço˘gunlukla birbiriyle e¸s anlamlı olarak kullanılır.
Dedi˘gimiz gibi, bir önceki bölümde parametreleri temel olarak nasıl kullanabilece˘gimizi ö˘ gren-mi¸stik. Bu bölümde ise “parametre” kavramına biraz daha ayrıntılı olarak bakmaya çalı¸saca˘gız.
Önce ¸su çok basit fonksiyona bir bakalım:
def bas(kelime):
print("merhaba", kelime)
Buradabas() adlı bir fonksiyon tanımladık. Bu fonksiyon tek bir parametre alıyor. Fonksiyon-umuzda bu parametreyi bir karakter dizisi içinde kullanıyoruz. Bu fonksiyonu çalı¸stırdı˘gımızda, bas() fonksiyonuna argüman olarak verdi˘gimiz kelime “merhaba” karakter dizisi ile birlikte ekrana basılacaktır. Mesela bu fonksiyonu “istihza” argümanıyla ça˘gıralım:
bas("istihza")
Kodlarımız ¸söyle görünecek:
def bas(kelime):
print("merhaba", kelime)
bas("istihza")
Bu kodları bir dosyaya kaydedip çalı¸stırdı˘gımızda ¸söyle bir çıktı elde ederiz:
merhaba istihza
Gördü˘günüz gibi,bas() fonksiyonuna verdi˘gimiz “istihza” argümanı “merhaba” karakter dizisi ile birlikte ekrana basılıyor. Kodlarımızı biraz geli¸stirelim:
def bas(kelime):
print("merhaba", kelime) soru = input("adınız nedir? ") bas(soru)
Bu kodlar, “merhaba” karakter dizisi ile birlikte ekrana dökülecek kelimeyi do˘grudan kullanıcı-dan alıyor... Bu arada, yazdı˘gımız fonksiyonun nerede ba¸slayıp nerede bitti˘gine dikkat edelim.
“soru = input(....” satırı ve ondan sonraki kısım fonksiyonumuzun dı¸sında yer alıyor.
Dedi˘gimiz gibi,bas() fonksiyonu tek bir argüman alıyor. Dolayısıyla bu fonksiyonu argümansız olarak ça˘gıramayız:
def bas(kelime):
print("merhaba", kelime) soru = input("adınız nedir? ") bas()
E˘gerbas() fonksiyonunu bu ¸sekilde argümansız olarak yazıp çalı¸stırırsak a¸sa˘gıdakine benzer bir hata alırız:
TypeError: bas() takes exactly 1 positional argument (0 given)
Bu hata mesajı ¸söyle çevrilebilir: “TipHatası: bas() tamı tamına 1 adet sıralı argüman alır (0 verilmi¸s)”
Demek kibas() fonksiyonunu çalı¸stırabilmek için “1” adet argüman girmemiz gerekiyormu¸s...
Ne bir eksik, ne bir fazla... Bu arada hata mesajı içinde geçen “sıralı argüman” (positional argument) kavramından da biraz sonra bahsedece˘giz.
Fonksiyonlara istedi˘gimiz sayıda parametre verebiliriz. Ancak parametrelerimizi “makul”
sayıda tutmak, fonksiyonun hangi parametrelere ihtiyaç duydu˘gunu hatırlayabilmek açısından önemlidir:
def deneme(bir, iki, liste, ölçüt):
sonuç = bir * iki
if bir and iki != ölçüt:
liste.append(sonuç) else:
print("{0} ile çarpmaya izin vermiyoruz!".format(ölçüt)) print(liste)
Gördü˘günüz gibi, fonksiyonlara birden fazla parametre verebiliyoruz... Burada tanımladı˘gımız fonksiyon, “bir”, “iki”, “liste” ve “ölçüt” olmak üzere dört adet parametre alıyor. Yani bu fonksiyonu kullanabilmek için fonksiyonumuzu dört adet argüman ile ça˘gırmamız gerekiyor.
Fonksiyonumuzun içeri˘gine baktı˘gımız zaman ilk olarak ¸su satırı görüyoruz:
sonuç = bir * iki
Buna göre, deneme() adlı fonksiyondaki “bir” ve “iki” adlı parametreler birbiriyle çarpılıp
“sonuç” adlı de˘gi¸skeni olu¸sturacak. Ardından gelen satırda bir “if... else...” blo˘gu görüy-oruz. E˘ger “bir” ve “iki” parametrelerinin de˘geri “ölçüt” parametresinin de˘gerine e¸sit de˘gilse, bir önceki satırda belirledi˘gimiz “sonuç” adlı de˘gi¸skenin de˘gerini “liste” parametresine ekliy-oruz. Burada and adlı bool de˘gerinin anlamına dikkat edin. “sonuç” adlı de˘gi¸skenin listeye eklenebilmesi için hem “bir” de˘gerinin, hem de “iki” de˘gerinin “ölçüt”e e¸s olmaması gerekiyor.
Daha sonra else blo˘gunu tanımlıyoruz. Buna göre e˘ger “bir” ve “iki” parametrelerinden her-hangi birinin de˘geri “ölçüt”e e¸sitse, kullanıcıya “ölçüt ile çarpmaya izin vermiyoruz!” ¸seklinde bir uyarı gösteriyoruz. Son satırda ise “liste” adlı parametrenin de˘gerini ekrana basıyoruz...
¸
Simdi sıra geldi fonksiyonumuzu ça˘gırmaya:
ö˘geler = []
deneme(23, 5, ö˘geler, 4) Kodlarımızı topluca görelim:
def deneme(bir, iki, liste, ölçüt):
sonuç = bir * iki
if bir and iki != ölçüt:
liste.append(sonuç) else:
print("{0} ile çarpmaya izin vermiyoruz!".format(ölçüt)) print(liste)
ö˘geler = []
deneme(23, 5, ö˘geler, 4)
Burada öncelikle “ö˘geler” adlı bo¸s bir liste olu¸sturduk. Çünkü deneme() fonksiyonunun parametrelerinden birisi liste olmak zorunda... Ardından da deneme() fonksiyonunu ça˘ gırıy-oruz. Fonksiyonumuzu dört adet argüman ile ça˘gırdı˘gımıza dikkat edin. E˘ger argüman sayısı dörtten az veya fazla olursa programımız hata verecektir.
Bu kodları çalı¸stırdı˘gımızda ekrana, fonksiyon içinde belirtti˘gimiz listenin ö˘geleri basılacaktır.
Fonksiyonumuzu bir de ¸su argümanlarla ça˘gıralım:
def deneme(bir, iki, liste, ölçüt):
sonuç = bir * iki
if bir and iki != ölçüt:
liste.append(sonuç) else:
print("{0} ile çarpmaya izin vermiyoruz!".format(ölçüt)) print(liste)
ö˘geler = []
deneme(23, 5, ö˘geler, 5) Bu defa ¸söyle bir çıktı alıyoruz:
5 ile çarpmaya izin vermiyoruz!
[]
Bu çıktıyı almamızının sebebi “iki” adlı parametrenin de˘gerinin (5), “ölçüt” parametresinin de˘geriyle aynı olması (5). Fonksiyonumuz içinde böyle bir durum içinelse blo˘gunu yazmı¸s ve böyle bir duruma izin vermedi˘gimiz konusunda kullanıcıyı uyarmı¸stık...