• Sonuç bulunamadı

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...