Yukarıdaki örneklerde gördüğünüz gibi, bir fonksiyon tanımlarken, fonksiyon adını belirledikten sonra bir parantez işareti kullanıyoruz. Bu parantez işaretleri, örneklerde de gördüğümüz gibi hiçbir bilgi içermeyebilir. Yani bu parantezler boş olabilir. Ancak yapacağımız işin niteliğine göre bu parantezlerin içine birtakım bilgiler yerleştirmemiz gerekebilir. İşte bu bilgilere parametre adı verilir. Zaten Python fonksiyonları da asıl gücünü bu parametrelerden alır. Şimdi şöyle bir örnek verdiğimizi düşünelim:
Burada fonksiyonumuzu tanımladıktan sonra en sondaki selamla() satırı yardımıyla fonksiyonumuzu çağırdık. Yani tanımladığımız fonksiyona hayat öpücüğü verdik.
Ancak yukarıda tanımladığımız fonksiyon oldukça kısıtlı bir kullanım alanına sahiptir. Bu fonksiyon ekrana yalnızca merhaba, benim adım istihza! çıktısını verebilir. Eğer fonksiyonların yapabildiği şey bundan ibaret olsaydı, emin olun fonksiyonlar hiçbir işimize yaramazdı. Ama şimdi öğreneceğimiz parametre kavramı sayesinde fonksiyonlarımıza takla atmayı öğreteceğiz. Gelin isterseniz çok basit bir örnekle başlayalım:
Belki fark ettiniz, belki de fark etmediniz, ama burada aslında çok önemli bir şey yaptık. Fonksiyonumuza bir parametre verdik! Şimdiye kadar tanımladığımız fonksiyonlarda, fonksiyon tanımı hep boş bir parantezden oluşuyordu. Ancak bu defa parantezimizin içinde bir değişken adı görüyoruz. Bu değişkenin adı isim. Fonksiyonlar söz konusu olduğunda, parantez içindeki bu değişkenlere parametre adı verilir. Fonksiyonumuzu tanımlarken bir parametre belirttikten sonra bu parametreyi fonksiyonun gövdesinde de kullandık. İsterseniz şimdi tanımladığımız bu fonksiyonun bir işe yarayabilmesi için fonksiyonumuzu çağıralım:
Kodları bir arada görelim:
Bu kodları çalıştırdığımızda şöyle bir çıktı alırız:
Burada selamla() adlı fonksiyonu istihza argümanı ile birlikte çağırdık. Böylece çıktıda istihza değerini aldık. Burada terminolojiyle ilgili ufak bir not düşelim: Fonksiyonlar tanımlanırken parantez içinde belirtilen değerlere parametre adı verilir. Aynı fonksiyon çağrılırken parantez içinde belirtilen değerlere ise argüman adı verilir. Ama her iki durum için de parametre adının kullanıldığını da görebilirsiniz bazı yerlerde...
Neyse... Biz bu terminoloji işini bir kenara bırakıp yolumuza devam edelim.
Eğer selamla() adlı fonksiyonu farklı bir argüman ile çağırırsak elbette alacağımız çıktı da farklı olacaktır:
Bu defa çıktımız şöyle:
Burada önemli olan nokta, selamla() adlı fonksiyonun bir adet parametreye sahip olmasıdır. Dolayısıyla bu fonksiyonu argümansız olarak veya birden fazla argümanla çağıramayız. Yani fonksiyonu şu şekillerde çağırmak hata almamıza yol açacaktır:
veya:
Sanırım bu örnekler fonksiyonlardaki parametre kavramının ne işe yaradığını net bir biçimde ortaya koyuyor. Daha sonraki bölümlerde bu parametre kavramından bolca yararlanacağız. İlerde göreceğimiz örnekler ne kadar karmaşık olursa olsun, işin temeli aynen yukarıda anlattığımız gibidir. Eğer bu temeli iyi kavrarsanız başka yerlerde göreceğiniz daha karmaşık örnekleri anlamakta zorlanmazsınız.
Dilerseniz bu anlattıklarımızla ilgili ufak bir örnek daha yapıp başka bir konuya geçelim...
Pythonda, verilen sayıları toplayan sum() adlı bir fonksiyon bulunur. Bu fonksiyonu şöyle kullanıyoruz:
sum() fonksiyonu, kendisine argüman olarak verilen bir sayı listesinin öğelerini birbiriyle toplayıp sonucu bize bildiriyor. Ancak Pythonda bu sum() fonksiyonuna benzer bir şekilde bir sayı listesini alıp, öğelerini birbiriyle çarpan hazır bir fonksiyon bulunmuyor. Python bize bu işlem için herhangi bir hazır fonksiyon sunmadığından, böyle bir durumda kendi yöntemimizi kendimiz icat etmek zorundayız. O halde hemen başlayalım. Diyelim ki elimizde şöyle bir sayı listesi var:
Soru şu: Acaba bu listedeki sayıları birbiriyle nasıl çarparız? Bunu yapmanın en kolay yolu, listedeki bütün sayıları 1le çarpıp, bütün değerleri tek bir değişken içinde toplamaktır. Yani öncelikle değeri 1 olan bir değişken belirlememiz gerekiyor:
Daha sonra listedeki bütün sayıları a değişkeninin değeriyle çarpıp, bu değeri yine a değişkenine atayacağız:
Böylece listedeki bütün sayıların çarpımını gösteren değer a değişkenine atanmış oldu. İsterseniz bu a değerini yazdırıp sonucu kendi gözlerinizle görebilirsiniz:
Gördüğünüz gibi, listedeki bütün sayıların çarpımı a değişkeninde tutuluyor.
Kodları topluca görelim:
Şimdi şöyle bir düşünün. Diyelim ki bir program yazıyorsunuz ve bu programın değişik yerlerinde, bir liste içindeki sayıları birbiriyle çarpmanız gerekiyor. Bunun için şöyle bir yol takip edebilirsiniz:
Önce bir sayı listesi tanımlarsınız,
Daha sonra, değeri 1 olan bir değişken tanımlarsınız,
Son olarak da listedeki bütün sayıları bu değişkenin değeriyle çarpıp, elde ettiğiniz değeri tekrar bu değişkene atarsınız,
Program içinde, gereken her yerde bu işlemleri tekrar edersiniz...
Bu yöntem, sizi aynı şeyleri sürekli tekrar etmek zorunda bıraktığı için oldukça verimsiz bir yoldur. İşte Pythondaki fonksiyonlar böyle bir durumda hemen devreye girer. Mantıklı bir programcı, yukarıdaki gibi her defasında tekerleği yeniden icat etmek yerine, tekerleği bir kez icat eder, sonra gereken yerlerde icat ettiği bu tekerleği kullanır. Biz de yukarıdaki işlemleri içeren bir fonksiyonu tek bir kez tanımlayacağız ve program içinde gereken yerlerde bu fonksiyonu çağıracağız. Şimdi gelin yukarıdaki işlemleri içeren fonksiyonumuzu tanımlayalım:
Böylece taslağımızı oluşturmuş olduk. Artık bu fonksiyonu kullanarak istediğimiz bir sayı grubunu birbiriyle rahatlıkla çarpabiliriz. Bunun için yapmamız gereken tek şey carp() adlı fonksiyonu çağırmak:
Burada dikkat ederseniz, carp() fonksiyonuna verdiğimiz sayıları bir liste içine aldık. Çünkü carp() fonksiyonu tek bir parametre alıyor. Eğer bu fonksiyonu şu şekilde çağırırsanız hata alırsınız:
Çünkü burada carp() fonksiyonuna birden fazla argüman verdik. Halbuki fonksiyonumuz sadece tek bir argüman alıyor. Elbette dilerseniz önce bir sayı listesi tanımlayabilir, ardından da bu listeyi fonksiyona argüman olarak verebilirsiniz:
Şimdi kodları topluca görelim:
Bu kodları çalıştırdığınızda 105 sonucunu alırsınız.
Bu arada, yukarıdaki kodlarda carp() fonksiyonuna ait liste adlı parametrenin yalnızca temsili bir isimlendirme olduğuna dikkat edin. Program içinde daha sonra fonksiyonu çağırırken argüman olarak kullanacağınız değerin liste adını taşıma zorunluluğu yoktur. Mesela bizim örneğimizde carp() fonksiyonunu sayilar adlı bir liste ile çağırdık...
Fonksiyonların işimizi ne kadar kolaylaştırdığını görüyorsunuz. Yapmak istediğimiz işlemleri bir fonksiyon olarak tanımlıyoruz ve gerektiği yerde bu fonksiyonu çağırarak işimizi hallediyoruz. Eğer işlemlerde bir değişiklik yapmak gerekirse, tanımladığımız fonksiyonu yeniden düzenlememiz yeterli olacaktır. Eğer fonksiyonlar olmasaydı, fonksiyon içinde tek bir kez tanımladığımız işlemi programın farklı yerlerinde defalarca tekrar etmemiz gerekecekti. Üstelik işlemlerde bir değişiklik yapmak istediğimizde de, bütün programı baştan sona tarayıp değişiklikleri tek tek elle uygulamak zorunda kalacaktık...
Dilerseniz en başta verdiğimiz dilekçe örneğine tekrar dönelim ve o durumu fonksiyonlara uyarlayalım:
Gördüğünüz gibi, yukarıdaki fonksiyon işimizi bir hayli kolaylaştırıyor. Burada fonksiyonumuzu sadece bir kez oluşturuyoruz. Ardından dilekçeyi kime göndereceksek, uygun bilgileri kullanarak yeni bir fonksiyon çağrısı yapabiliriz. Mesela dilekçeyi Ahmet Beye göndereceksek şöyle bir satır yazmamız yeterli olacaktır:
Ayrıca dilekçe metninde bir değişiklik yapmak istediğimizde sadece fonksiyon gövdesini düzenlememiz yeterli olacaktır.
Kod:
# -*- coding: utf-8 -*-
[INDENT] def selamla():print merhaba, benim adım istihza! selamla()
[/INDENT]
Burada fonksiyonumuzu tanımladıktan sonra en sondaki selamla() satırı yardımıyla fonksiyonumuzu çağırdık. Yani tanımladığımız fonksiyona hayat öpücüğü verdik.
Ancak yukarıda tanımladığımız fonksiyon oldukça kısıtlı bir kullanım alanına sahiptir. Bu fonksiyon ekrana yalnızca merhaba, benim adım istihza! çıktısını verebilir. Eğer fonksiyonların yapabildiği şey bundan ibaret olsaydı, emin olun fonksiyonlar hiçbir işimize yaramazdı. Ama şimdi öğreneceğimiz parametre kavramı sayesinde fonksiyonlarımıza takla atmayı öğreteceğiz. Gelin isterseniz çok basit bir örnekle başlayalım:
Kod:
# -*- coding: utf-8 -*- def selamla(isim): print "merhaba, benim adım %s!" %isim
Belki fark ettiniz, belki de fark etmediniz, ama burada aslında çok önemli bir şey yaptık. Fonksiyonumuza bir parametre verdik! Şimdiye kadar tanımladığımız fonksiyonlarda, fonksiyon tanımı hep boş bir parantezden oluşuyordu. Ancak bu defa parantezimizin içinde bir değişken adı görüyoruz. Bu değişkenin adı isim. Fonksiyonlar söz konusu olduğunda, parantez içindeki bu değişkenlere parametre adı verilir. Fonksiyonumuzu tanımlarken bir parametre belirttikten sonra bu parametreyi fonksiyonun gövdesinde de kullandık. İsterseniz şimdi tanımladığımız bu fonksiyonun bir işe yarayabilmesi için fonksiyonumuzu çağıralım:
Kod:
selamla("istihza")
Kodları bir arada görelim:
Kod:
# -*- coding: utf-8 -*- def selamla(isim): print "merhaba, benim adım %s!" %isim selamla("istihza")
Bu kodları çalıştırdığımızda şöyle bir çıktı alırız:
Kod:
merhaba, benim adım istihza!
Burada selamla() adlı fonksiyonu istihza argümanı ile birlikte çağırdık. Böylece çıktıda istihza değerini aldık. Burada terminolojiyle ilgili ufak bir not düşelim: Fonksiyonlar tanımlanırken parantez içinde belirtilen değerlere parametre adı verilir. Aynı fonksiyon çağrılırken parantez içinde belirtilen değerlere ise argüman adı verilir. Ama her iki durum için de parametre adının kullanıldığını da görebilirsiniz bazı yerlerde...
Neyse... Biz bu terminoloji işini bir kenara bırakıp yolumuza devam edelim.
Eğer selamla() adlı fonksiyonu farklı bir argüman ile çağırırsak elbette alacağımız çıktı da farklı olacaktır:
Kod:
def selamla(isim): print "merhaba, benim adım %s!" %isim selamla("Ahmet Efendi")
Bu defa çıktımız şöyle:
Kod:
merhaba, benim adım Ahmet Efendi!
Burada önemli olan nokta, selamla() adlı fonksiyonun bir adet parametreye sahip olmasıdır. Dolayısıyla bu fonksiyonu argümansız olarak veya birden fazla argümanla çağıramayız. Yani fonksiyonu şu şekillerde çağırmak hata almamıza yol açacaktır:
Kod:
selamla("Ahmet", "Mehmet")
veya:
Kod:
selamla()
Sanırım bu örnekler fonksiyonlardaki parametre kavramının ne işe yaradığını net bir biçimde ortaya koyuyor. Daha sonraki bölümlerde bu parametre kavramından bolca yararlanacağız. İlerde göreceğimiz örnekler ne kadar karmaşık olursa olsun, işin temeli aynen yukarıda anlattığımız gibidir. Eğer bu temeli iyi kavrarsanız başka yerlerde göreceğiniz daha karmaşık örnekleri anlamakta zorlanmazsınız.
Dilerseniz bu anlattıklarımızla ilgili ufak bir örnek daha yapıp başka bir konuya geçelim...
Pythonda, verilen sayıları toplayan sum() adlı bir fonksiyon bulunur. Bu fonksiyonu şöyle kullanıyoruz:
Kod:
>>> sayilar = [45, 90, 43] >>> sum(sayilar) 178
sum() fonksiyonu, kendisine argüman olarak verilen bir sayı listesinin öğelerini birbiriyle toplayıp sonucu bize bildiriyor. Ancak Pythonda bu sum() fonksiyonuna benzer bir şekilde bir sayı listesini alıp, öğelerini birbiriyle çarpan hazır bir fonksiyon bulunmuyor. Python bize bu işlem için herhangi bir hazır fonksiyon sunmadığından, böyle bir durumda kendi yöntemimizi kendimiz icat etmek zorundayız. O halde hemen başlayalım. Diyelim ki elimizde şöyle bir sayı listesi var:
Kod:
>>> sayilar = [45, 90, 43]
Soru şu: Acaba bu listedeki sayıları birbiriyle nasıl çarparız? Bunu yapmanın en kolay yolu, listedeki bütün sayıları 1le çarpıp, bütün değerleri tek bir değişken içinde toplamaktır. Yani öncelikle değeri 1 olan bir değişken belirlememiz gerekiyor:
Kod:
>>> a = 1
Daha sonra listedeki bütün sayıları a değişkeninin değeriyle çarpıp, bu değeri yine a değişkenine atayacağız:
Kod:
>>> for i in sayilar: ... a = a * i
Böylece listedeki bütün sayıların çarpımını gösteren değer a değişkenine atanmış oldu. İsterseniz bu a değerini yazdırıp sonucu kendi gözlerinizle görebilirsiniz:
Kod:
>>> print a 174150
Gördüğünüz gibi, listedeki bütün sayıların çarpımı a değişkeninde tutuluyor.
Kodları topluca görelim:
Kod:
>>> sayilar = [45, 90, 43] >>> a = 1 >>> for i in sayilar: ... a = a * i ... >>> print a 174150
Şimdi şöyle bir düşünün. Diyelim ki bir program yazıyorsunuz ve bu programın değişik yerlerinde, bir liste içindeki sayıları birbiriyle çarpmanız gerekiyor. Bunun için şöyle bir yol takip edebilirsiniz:
Önce bir sayı listesi tanımlarsınız,
Daha sonra, değeri 1 olan bir değişken tanımlarsınız,
Son olarak da listedeki bütün sayıları bu değişkenin değeriyle çarpıp, elde ettiğiniz değeri tekrar bu değişkene atarsınız,
Program içinde, gereken her yerde bu işlemleri tekrar edersiniz...
Bu yöntem, sizi aynı şeyleri sürekli tekrar etmek zorunda bıraktığı için oldukça verimsiz bir yoldur. İşte Pythondaki fonksiyonlar böyle bir durumda hemen devreye girer. Mantıklı bir programcı, yukarıdaki gibi her defasında tekerleği yeniden icat etmek yerine, tekerleği bir kez icat eder, sonra gereken yerlerde icat ettiği bu tekerleği kullanır. Biz de yukarıdaki işlemleri içeren bir fonksiyonu tek bir kez tanımlayacağız ve program içinde gereken yerlerde bu fonksiyonu çağıracağız. Şimdi gelin yukarıdaki işlemleri içeren fonksiyonumuzu tanımlayalım:
Kod:
def carp(liste): a = 1 for i in liste: a = a * i print(a)
Böylece taslağımızı oluşturmuş olduk. Artık bu fonksiyonu kullanarak istediğimiz bir sayı grubunu birbiriyle rahatlıkla çarpabiliriz. Bunun için yapmamız gereken tek şey carp() adlı fonksiyonu çağırmak:
Kod:
carp([3, 5, 7])
Burada dikkat ederseniz, carp() fonksiyonuna verdiğimiz sayıları bir liste içine aldık. Çünkü carp() fonksiyonu tek bir parametre alıyor. Eğer bu fonksiyonu şu şekilde çağırırsanız hata alırsınız:
Kod:
carp(3, 5, 7)
Çünkü burada carp() fonksiyonuna birden fazla argüman verdik. Halbuki fonksiyonumuz sadece tek bir argüman alıyor. Elbette dilerseniz önce bir sayı listesi tanımlayabilir, ardından da bu listeyi fonksiyona argüman olarak verebilirsiniz:
Kod:
sayilar = [3, 5, 7] carp(sayilar)
Şimdi kodları topluca görelim:
Kod:
# -*- coding: utf-8 -*- def carp(liste): a = 1 for i in liste: a = a * i print(a) sayilar = [3, 5, 7] carp(sayilar)
Bu kodları çalıştırdığınızda 105 sonucunu alırsınız.
Bu arada, yukarıdaki kodlarda carp() fonksiyonuna ait liste adlı parametrenin yalnızca temsili bir isimlendirme olduğuna dikkat edin. Program içinde daha sonra fonksiyonu çağırırken argüman olarak kullanacağınız değerin liste adını taşıma zorunluluğu yoktur. Mesela bizim örneğimizde carp() fonksiyonunu sayilar adlı bir liste ile çağırdık...
Fonksiyonların işimizi ne kadar kolaylaştırdığını görüyorsunuz. Yapmak istediğimiz işlemleri bir fonksiyon olarak tanımlıyoruz ve gerektiği yerde bu fonksiyonu çağırarak işimizi hallediyoruz. Eğer işlemlerde bir değişiklik yapmak gerekirse, tanımladığımız fonksiyonu yeniden düzenlememiz yeterli olacaktır. Eğer fonksiyonlar olmasaydı, fonksiyon içinde tek bir kez tanımladığımız işlemi programın farklı yerlerinde defalarca tekrar etmemiz gerekecekti. Üstelik işlemlerde bir değişiklik yapmak istediğimizde de, bütün programı baştan sona tarayıp değişiklikleri tek tek elle uygulamak zorunda kalacaktık...
Dilerseniz en başta verdiğimiz dilekçe örneğine tekrar dönelim ve o durumu fonksiyonlara uyarlayalım:
Kod:
# -*- coding: utf-8 -*- def dilekce_gonder(kime, tarih, kimden): print """\ Sayın %s, %s tarihinde yaptığımız başvurunun sonuçlandırılması hususunda yardımlarınızı rica ederiz. Saygılarımızla, %s""" %(kime, tarih, kimden) dilekce_gonder("Mehmet Bey", "19.12.2009", "Orçun Kunek")
Gördüğünüz gibi, yukarıdaki fonksiyon işimizi bir hayli kolaylaştırıyor. Burada fonksiyonumuzu sadece bir kez oluşturuyoruz. Ardından dilekçeyi kime göndereceksek, uygun bilgileri kullanarak yeni bir fonksiyon çağrısı yapabiliriz. Mesela dilekçeyi Ahmet Beye göndereceksek şöyle bir satır yazmamız yeterli olacaktır:
Kod:
dilekce_gonder("Ahmet Bey", "21.01.2010", "Erdener Topçu")
Ayrıca dilekçe metninde bir değişiklik yapmak istediğimizde sadece fonksiyon gövdesini düzenlememiz yeterli olacaktır.
