Genel Tekrar
10.1 Fonksiyon Tanımlamak
Giri¸s kısmında söyledi˘gimiz gibi, fonksiyonlar i¸slerimizi otomatikle¸stirmemizi sa˘glar. Hatır-larsanız, bundan önceki derslerimizin birinde sum() adlı bir fonksiyondan söz etmi¸stik. Bu fonksiyon, mesela bir liste içindeki bütün sayıların toplamını veriyordu bize. Bu fonksiyonu
¸
söyle kullanıyorduk:
>>> a = [2, 3, 4]
>>> sum(a)
9
Peki bu fonksiyon nasıl oluyor da i¸slerimizi otomatikle¸stirmemizi sa˘glıyor?
Bir an için Python’da fonksiyon diye bir ¸seyin olmadı˘gını varsayalım. Yukarıdaki gibi, bir liste içindeki bütün sayıları toplamak istedi˘gimizde ¸söyle bir ¸sey yazmamız gerekecekti:
169
>>> lst = [2, 3, 4]
>>> a = 0
>>> for i in lst:
... a = a + i
... print(a)
Ba¸ska bir grup sayıyı toplamak istedi˘gimizde ise bu kodları en ba¸stan tekrar yazmak zorunda kalacaktık:
>>> lst2 = [10, 20, 56, 55]
>>> a2 = 0
>>> for v in lst2:
... a2 = a2 + v
... print(a2)
E˘ger sum() fonksiyonu olmasaydı, program içinde ne zaman bir grup sayıyı toplamak iste-sek yukarıdaki kodları her defasında yeni ba¸stan yazmanız gerekecekti... Ama Python’un bize sundu˘gusum() fonksiyonu sayesinde bu i¸slemlerin hiçbirini yapmak zorunda kalmıyoruz.
Programımız içinde bir grup sayıyı toplamak istedi˘gimizde sadecesum() fonksiyonunu ça˘ gır-mamız yeterli oluyor. Yani bu fonksiyon bir anlamda i¸slerimizi otomatik bir hale getirmemizi sa˘glıyor...
sum() oldukça faydalı bir fonksiyondur. Bu fonksiyon sayesinde, bir kere yazılmı¸s bir kod parçasını farklı yerlerde ve programlarda tekrar tekrar kullanabiliyoruz. Zaten fonksiyonların ana görevlerinden biri de, bir kere yazılmı¸s kodların tekrar tekrar kullanılabilmesini sa˘glamaktır.
Yabancılar buna “code reusability” adını veriyor...
sum() fonksiyonu, bir grup sayıyı kolay bir ¸sekilde toplamamızı sa˘glayan bir araçtır. An-cak Python’da tıpkı bu sum() fonksiyonuna benzer ¸sekilde bir liste içindeki bütün sayıları çarpan, do˘grudan kullanabilece˘gimiz özel bir fonksiyon bulunmaz. Ama biz istersek fonksiy-onlar yardımıyla kendimiz için böyle bir fonksiyon yazabiliriz. ¸Simdi bunu nasıl yapaca˘gımıza bakalım. Hem böylece fonksiyonlar konusuna da hızlı bir giri¸s yapmı¸s olalım.
Python’da bir fonksiyonu kullanabilmek için öncelikle o fonksiyonu tanımlamamız gerekir. Bu tanımlama i¸sinidef adlı bir parçacık yardımıyla yapıyoruz. Python’da bir fonksiyon ¸söyle tanım-lanır (Bu kodları dosyaya kaydedelim):
def fonksiyon_adı():
Madem biz çarpma yapan bir fonksiyon yazaca˘gız, o halde fonksiyonumuzu ¸söyle tanımlaya-biliriz:
def çarp():
Buradadef parçacı˘gı fonksiyonumuzu tanımlamamızı sa˘glıyor. “çarp()” ise fonksiyonumuzun adı... Bu arada “çarp” kelimesinin sonuna “()” i¸saretini ve ardından da iki nokta üst üsteyi koymayı asla unutmuyoruz. ¸Simdi yapmamız gereken ¸sey fonksiyonumuzun içeri˘gini yazmak olacak:
Burada girintilere özellikle dikkat ediyoruz... Bu kodlarda yaptı˘gımız ¸sey, “[2, 3, 4]” listesinin
tek tek bütün ö˘gelerini “1” sayısıyla çarpıp, sonucu a de˘gi¸skenine atamaktan ibaret... Bu i¸slem nihai olarak listedeki bütün sayıların birbiriyle çarpılmasını sa˘glayacaktır.
Böylece fonksiyonumuzu tanımlamı¸s olduk. ¸Su anda yapmamız gereken tek bir ¸sey kaldı. O da yazdı˘gımız fonksiyonumuzu ça˘gırmak:
çarp()
Bunu da kodlarımız arasına ekleyelim:
def çarp():
Yine girintilere çok dikkat ediyoruz... Ayrıca tanımladı˘gımız fonksiyonun sınırlarına da dikkat edin. Bir fonksiyon, def parçacı˘gıyla ba¸slar, kendisinden sonra gelen girintili kod blo˘guyla devam eder. Bu kod blo˘gunun dı¸sında kalan her ¸sey fonksiyonun da dı¸sındadır. Mesela burada yazdı˘gımız “çarp()” satırı fonksiyonun bir parçası de˘gildir. Tanımladı˘gımız fonksiyon sadece koyu harflerle gösterilen kodlardan ibarettir. “çarp()” satırının görevi ise tanımladı˘gımız fonksiyonu ça˘gırmaktır. Bu demek oluyor ki, Python’da bir fonksiyonu kullanabilmek için önce o fonksiyonu tanımlamamız, ardından da bu fonksiyonu ça˘gırmamız gerekiyor. Yukarıdaki örnekte, koyu harflerle gösterilen kısım fonksiyonun tanımlandı˘gı kısımdır... Bundan sonra gelen “çarp()” ifadesi ise fonksiyonumuzu ça˘gırdı˘gımız kısım oluyor... Bu önemli bilgiyi de ö˘grendi˘gimize göre yolumuza devam edebiliriz...
Bu arada, bu bölümün en ba¸sında örnek olarak verdi˘gimiz toplama i¸slemi yapan kodları da bir fonksiyon haline getirelim isterseniz:
Son olarak fonksiyonumuzu ça˘gırıyoruz:
topla()
Bunu da kodlarımızın arasına yerle¸stirelim:
def topla():
Yukarıda tanımladı˘gımız çarp() ve topla() adlı fonksiyonları bir dosyaya kaydedip çalı¸stırdı˘gımızda Python bize ilgili i¸slemlerin sonucunu verecektir. Yani çarp() fonksiyonu
“2”, “3” ve “4” sayılarının çarpımını, topla() fonksiyonu ise “2”, “3” ve “4” sayılarının toplamını gösterecektir. Burada fonksiyonların i¸simizi nasıl da kolayla¸stırdı˘gına dikkat edin.
Yukarıda tanımladı˘gımızçarp() fonksiyonu sayesinde, bir grup sayıyı çarpmak istedi˘gimiz za-man, bütün kodları her defasında yeni ba¸stan yazmak yerine sadece çarp() fonksiyonunu ça˘gırmamız yeterli olacaktır...
Yalnız dikkat ederseniz, burada yazdı˘gımız fonksiyonlar kısıtlı. Bu fonksiyonlar sadece “2”, “3”
ve “4” sayıları üzerinde i¸slem yapabiliyor. Bunun nedeni bizim bu üç sayıyı fonksiyon içinde do˘grudan tanımlamı¸s olmamız... E˘ger fonksiyonumuzu daha esnek bir hale getirmek istersek, örne˘ginçarp() fonksiyonunu ¸su ¸sekilde yazmamız gerekir:
def çarp(liste):
a = 1
for i in liste:
a = i * a print(a)
Burada, bir önceki yazımdan farklı olarak herhangi bir sayı belirtmedik. Onun yerine “liste” adlı bir de˘gi¸sken olu¸sturup bunu fonksiyona parametre olarak verdik... Bu sayede fonksiyonumuz herhangi bir sayı listesinin içeri˘gini çarpabilecek. Bir deneme yapalım:
sayılar = [24, 56, 77, 87]
çarp(sayılar)
Yazdı˘gımız kodlar tam olarak ¸söyle görünecek:
def çarp(liste):
Bu kodları bir dosyaya kaydedip çalı¸stırdı˘gımızda ¸su sonucu alırız:
9003456
Gördü˘günüz gibi fonksiyonlar, yazdı˘gımız kodları bir araya toplamamızı, gruplandırmamızı da sa˘glamanın yanısıra, yapaca˘gımız i¸slemler için bir ¸sablon olu¸sturma vazifesi de görüyor. Pek çok kez kullanmamız gereken i¸slevleri bir ¸sablon haline getirerek, bu ¸sablon üzerinden, ben-zer i¸slemleri tek bir komutla halledebiliyoruz. ˙Ilerleyen derslerimizde “modüller” konusunu ö˘grendi˘gimizde bu fonksiyonları çok daha verimli bir biçimde kullanabilece˘giz.
Fonksiyonlar, yazdı˘gımız programlarda i¸slerimizi bir hayli kolayla¸stırır. Fonksiyonlar olmasaydı bir program içinde defalarca yazmak zorunda kalaca˘gımız kodları bir kez fonksiyon olarak tanımladıktan sonra program içinde tekrar tekrar kullanabiliriz. E˘ger kodlarda bir de˘gi¸siklik yapmamız gerekirse sadece fonksiyon içinde de˘gi¸siklik yapmamız yeterli olacaktır. Öbür türlü, program içinde oraya buraya da˘gılmı¸s kod parçalarını tek tek bulup düzeltmemiz gerekecekti...
Özellikle arayüz tasarlarken fonksiyonlardan bolca yararlanaca˘gız...
Fonksiyonlarla ilgili çok basit bir örnek verelim. Diyelim ki bir program yazdık ve programın bir yerinde kullanıcıdan sayı girmesini istiyoruz. Bunun, programımızın hata vermesine yol açma potansiyeli ta¸sıyan bir i¸slem oldu˘gunu varsayalım. Programın çalı¸sması sırasında bir hatayla kar¸sıla¸sıldı˘gında kullanıcıya genel bir hata mesajı göstermek istersek ¸söyle bir kod yazabiliriz:
try:
soru = input("gerekli sayıyı giriniz: ") except:
print("Beklenmeyen bir hata olu¸stu.")
print("Bu hatayı, hata takip sistemine raporlayınız!..")
Yine diyelim ki “except” blo˘gu içinde yazdı˘gımız genel hata mesajını programımızın ba¸ska yerlerinde de aynen kullanmak istiyoruz. Yani mesela ¸söyle bir ¸sey yapmak istiyoruz:
try:
soru = int(input("gerekli sayıyı giriniz: ")) except:
print("Beklenmeyen bir hata olu¸stu.")
print("Bu hatayı, hata takip sistemine raporlayınız!..")
#Burada programımıza ait ba¸ska kodlar yer alıyor...
try:
soru2 = int(input("ba¸ska bir sayı giriniz: ")) except:
print("Beklenmeyen bir hata olu¸stu.")
print("Bu hatayı, hata takip sistemine raporlayınız!..")
Burada dikkat ederseniz, genel hata mesajını göstermek istedi˘gimiz her yerde bu mesajları tekrar tekrar yazmamız gerekiyor. ˙I¸ste fonksiyonlar böyle durumlarda i¸slerimizi kolayla¸ stıra-bilir... Yukarıdaki kodları fonksiyonlar yardımıyla ¸su ¸sekilde sadele¸stirebiliriz:
def genelHata():
print("Beklenmeyen bir hata olu¸stu.")
print("Bu hatayı, hata takip sistemine raporlayınız!..")
try:
soru = int(input("gerekli sayıyı giriniz: ")) except:
genelHata()
#Burada programımıza ait ba¸ska kodlar yer alıyor...
try:
soru2 = int(input("ba¸ska bir sayı giriniz: ")) except:
genelHata()
Bu verdi˘gimiz çok basit bir örnektir, ama bu basit örnekte bile, fonksiyonların i¸simizi ne kadar kolayla¸stırabilece˘gini görebiliyoruz. Burada kullandı˘gımız fonksiyon öncelikle bizi aynı ¸seyleri tekrar tekrar yazma zahmetinden kurtarıyor. genelHata() adlı fonksiyonu bir kez tanımladık-tan sonra, gereken yerlerde sadece bu fonksiyonu ça˘gırarak i¸simizi halledebiliyoruz. Ayrıca e˘ger kullanıcıya göstermek istedi˘gimiz hata mesajında de˘gi¸siklik yapmak istersek, sadece fonksiyon içinde gerekli de˘gi¸siklikleri yapmamız yeterli olacaktır. E˘ger burada fonksiyon kul-lanmasaydık, hata mesajlarını kodlar içinde tek tek bulup de˘gi¸stirmemiz gerekecekti...
Bu bölümde gördü˘gümüz örneklerden de bildi˘gimiz gibi, yazdı˘gımız fonksiyonlara parametre atayarak bunları daha da esnek bir hale getirebiliyoruz:
def genelHata(eposta):
print("Beklenmeyen bir hata olu¸stu.")
print("Bu hatayı, {0} adresine raporlayınız!".format(eposta)) try:
soru = int(input("gerekli sayıyı giriniz: "))
except:
genelHata("abc123@abc.com") try:
soru2 = int(input("ba¸ska bir sayı giriniz: ")) except:
genelHata("123fds@cbc.com")
Bu programın çalı¸sması esnasında e˘ger ilk “try... except...” blo˘gu içinde bir hata meydana gelirse kullanıcıya “Bu hatayı abc123@abc.com adresine raporlayınız!” mesajı; e˘ger hata ik-inci “try... except...” blo˘gu içinde meydana gelirse de “Bu hatayı 123fds@cbc.com adresine raporlayınız!” mesajı gösterilecektir.
Bu arada dikkat ederseniz, genelHata() adlı fonksiyondaki “eposta” parametresi aslında bir
“yer tutucu” olmaktan öte bir anlam ifade etmiyor. Yani oraya istedi˘giniz bir kelimeyi yaz-abilirsiniz. Amacımız oraya bir parametre gelece˘gini belirtmek. Tabii ki parametrelerimizi ad-landırırken anlamlı isimler yazmamız her zaman için i¸simizi kolayla¸stıracaktır... Bu “parametre”
meselesini bir sonraki bölümde biraz daha ayrıntılı olacak inceleyece˘giz.
Bu bölümün son sözü olarak fonksiyonların adlandırılması konusunda birkaç ¸sey söyleyelim...
Fonksiyon adlarını küçük harflerle yazmak adettendir. Yani:
def fonk():
Burada görüldü˘gü gibi, fonksiyon adlarını yazarken küçük harfleri kullanıyoruz. E˘ger yaza-ca˘gımız fonksiyonun adı birden fazla kelimeden olu¸suyorsa, fonksiyon adını olu¸sturan ke-limeleri birbirinden “_” i¸sareti ile ayırıyoruz. Yani:
def fonksiyon_adı():
Daha nadir olarak, birden fazla kelimeden olu¸san fonksiyon adlarının ¸su ¸sekilde yazıldı˘gını da görebiliriz:
def fonksiyonAdı():
Son olarak, fonksiyon adlarının büyük harflerle ba¸sladı˘gı pek görülmez...