Bu derste programcılıktaki en önemli aşamayı öğreneceksiniz: Kendi fonksiyonlarınızı oluşturmak! Fonksiyonlar prograınızın daha kısa, daha organize, daha okunaklı, hata ayıklaması daha kolay ve tekrar tekrar kullanmaya daha elverişli olmasını sağlar. Gelecek derslerimizde fonksiyonların yineleme gibi diğer faydalarını göreceğiz.
Bir Fonksiyonu Tanımlamak
Önce bir örnekle başlayalım. abs
fonksiyonunu hatırlıyor musunuz? Bir argüman alıyordu (x sayısı) ve onun kesin değerini veriyordu (x ≥ 0 durumunda bu değer x, x < 0 durumunda ise -x oluyordu). Python'da bu fonksiyonu tanımlama yolu şöyledir:
def abs(x): # 'abs' adlı bir fonksiyonu 'x' adlı bir argümanla tanımlıyoruz if x >= 0: # fonksiyon gövdesi burada başlıyor return x else: return -x # fonksiyon gövdesi burada sonlanıyor(Click burada konsolda kodu test edebilirsiniz.)
Bir Fonksiyon Tanımının İki Parçası
Bir fonksiyon tanımındaki ilk satırda fonskiyonun adı ve argümanları belirtilir. Şu şekilde oluşturulur:
def «fonksiyon-adı»(«argüman-listesi»):
Yukarıdaki örnekte abs
fonksiyonun adı idi ve argüman listesinde x
bulunuyordu. Buna argüman listesi deniyor, çünkü birden fazla argüman bulunabilir x, y, z
gibi; veya hiç argüman da bulunmayabilir, boş liste. Argümanlar fonksiyonun inputlarıdır.
Bir fonksiyon tanımında ilk satırdan sonra gelen satırlar fonksyionun gövdesidir. Gövde girintili bir kod bloğu olacaktır. Fonksiyon her çağrıldığında, fonksiyon gövdesi en başta belirlenmiş argüman/inputlarla işleme konur. En sonunda fonksiyon gövdesindeki şu satıra ulaştığımızda,
return «değer»
fonksiyon çalışmayı durdurur ve output olarak «değer»
sonucunu verir. Yani bu, sonuç değeri, fonksiyonun çıktısıdır. Yukarıdaki abs
örenğinde gördüğümüz gibi gövde birden fazla return
ifadesi içerebilir; ama fonksyion sonrasında çalışmayı durdurduğu için sadece ilk olan işleme konur.
Örnek: Bir Fonksiyonu Tanımlama ve Çağırma
Aşağıdaki programda fonksiyon tanımı ve fonksiyonun tanımlanmasıyla işleme konacak diğer bazı ifadeler var. Outputu tahmin edebilir misiniz?
Fonksiyonun adı kare
, sadece bir argüman var x
, ve fonksiyon gövdesinde tek satır bulunuyor return x*x
. Fonksiyonun dışında, fonksiyonu toplamda üç kez çağırmamızı sağlayacak iki komutumuz var.
Görüntüleyiciden izleyebildiğimize göre, fonksiyon her çağrıldığında ayrı bir çalışma alanı parçası (bir çerçeve-frame) tahsis edilir. Fonksiyon dönüş yaptığında, o çalışma alanına artık ihtiyaç kalmadığından silinir.
Adımları burada kelimelerle açıklayalım:
- İlk komut işleme konduğunda Python
square(10)
ifadesini ele alır.- Python input listesi ile
(10)
argüman listesini(x)
karşılaştırır. Fonksiyon gövdesi dereturn x*x
işleminix
argümanının10
sayısı ile karşılandığını gözönünde turarak yapar. Böylecex*x
işlemi100
sonucunu verir.
- Python input listesi ile
- İkinci komut işleme konduğunda, Python
square(square(2))
ifadesini ele alır.- İlk olarak iç kısım
square(2)
değerlendirilir. Geçici olarakx
argümanına2
sayısını verdiğimizde fonksiyon gövdesini çalıştırır ve4
sonucunu alırız. - Sonra dış kısım değerlendirilir,
square(2)
bize4
sonucunu verdiği için şimdi argüman 4 olur:square(4)
. Bu da çıktı olarak16
sonucunu yazdırır.
- İlk olarak iç kısım
Dört Genel Hata
Birfonksiyon tanımlanırken yapılan hatalardan biri return
ifadesini kullanmayı unutmaktır.
Gördüğünüz gibi eğer fonksiyon gövdesinde return
ifadesine rastlanmazsa, fonksiyon varsayılan sonuç olarak None
yazdırır. Yani eğer bir çalışmanızda None
sonucu almak gibi bir hata söz konusu olursa problem genellikle fonksiyon inputlarının işlenmesini sağlayacak return
bulunamamasıdır.
return ifadesini bilerek de kullanmamış olabilirsiniz. Bu ancak fonksiyonunuzun return değerinden başka bir çıktı oluşturma kapasitesi olduğunda anlamlıdır:
|
Başka bir hata ise kodu yazarken girintileri koymamaktır, IndentationError
hatası ile sonuçlanır.
2. derste gördüğümüz gibi fonksiyonu gerekenden fazla veya az argümanla çağırmak da hataya yol açar.
Son olarak, fonksiyonu tanımlarken veya çağırırken yazım hatası yaparsanız, fonksiyon tanımlanmış değil "function is undefined" diyen bir hata alırsınız.
Siz de Deneyin
Bu alıştırmada veya daha sonra "fonksiyon tanımlayın" denilen alıştırmalarda input() veya print() kullanmamız gerekmeyecek. Düzenleyici fonksiyonunuzu argümanlarla otomatik olarak çağıracak ve doğrudan, döndürülen sonucu inceleyecektir. Bu alıştırma için doğru çözüm 2 satır olacak (dersin yukarıdaki 'Bir fonksiyon tanımının iki parçası' bölümüne bakınız.). |
İki veya Daha Fazla Argüman
Yukarıdaki fonksiyonlar sadece bir argüman alır, ama bir fonksiyonu istediğiniz sayıda argümanla da oluşturabilirsiniz. Mesela, The functions above only took one argument, but a function can be designed to take any number of arguments. Mesela input()
fonksiyonunu 0 argümanla çağırıyorduk (ve 15A dersinde sıfır argümanlı bir fonksiyon tanımlayacağız).
İşte burada da geometri ile ilgili iki argümanlı bir örnek. Diyelim ki tabanı ve yüksekliği belirli bir üçgenin alanını hesaplamak için bir fonksiyon yazacağız. Üçgenin alan formülü
alan = taban × yükseklik / 2
Kod şöyle görünür: def «fonksiyon-adı»(«argüman1»)
yapısını def «fonksiyon-adı»(«argüman1», «argüman2»)
şeklinde değiştiririz.
Kaydetmemiz gereken başka bir önemli şey de, bir fonksiyonun tanımlanması ile yürütülmesi farklı şeylerdir. Fonksiyon çağrılmadığı sürece gövde işleme konmaz. Bunu test etmek için şu örneğe bakalım:
def f(): # 0 argümanlı fonksiyon
print("in f")
print("not in f")
f() # f fonksiyonunu çağırıyoruz
f
fonksiyonu herşeyin başında tanımlanır, ama gövdesi hemen işleme konmaz. Fonksiyon tanımlandıktan sonra not in f
yazdırıyoruz. Daha sonra fonksiyon çağrılır, gövde işleme konurve in f
yazdırır.Son alıştırmada sizden bir dörtgenin çevresini hesaplamak üzere iki argümanlı bir fonksiyon yazmanızı isteyeceğiz. (Çevre bilindiği gibi tüm kenarların toplamıdır.) Belirli bir en ve boya sahip dörtgenin çevresini hesaplama formülü şöyledir:
Örnek için yandaki şekle bakınız.
Fonksiyonları Çağıran Fonksiyonlar
Fonksiyonlar iyi inşa edilmiş büyük çaplı programların yapı taşlarıdır: Bir işlemi aynı kodu tekrar yazmadan ikinci kez yapabilirsiniz, genel işlemler için aynı çözümleri tekrar devreye sokabilirsiniz. Bir fonksiyon oluşturup onu bir diğerinin içinde kullanacağımız bir öneğe bakalım.
Programı çalıştırmadan önce, programın ne yapacağını tahmin edebilir misiniz? 4. dersten hatırlayacaksınız sayılarla stirnglerin çarpımının sonucunda, stirng o sayıda kopyalanıyordu. Örneğin, "bar"*2 "barbar" . |
Dikey gri çizgiyi sağa ve sola çekerek kod veya görüntüleyicinin ne kadarlık alanda görüneceğini belirleyebilirsiniz.
Görüntülemede yeni bir özellik görüyorsunuz: "Çerçeveler" sütununun altında, biz 30 adımlık işlemin 8. adımındayken, sadece bazı küresel değişkenler değil, 2 çerçeve You can see a new phenomenon in the visualization: under the "Frames" column, when we are at Step 8 of 30 in the execution, there are not only some global variables, but two frames (biri dış
, diğerir iç
şeklinde yeni oluşturuldu) de bulunuyor. dış
çerçeve, iç
çerçeve tam olarak sonlanana kadar bekler ve daha sonra dış
kaldığı yerden devam eder. Bu, iç
çerçeveye yeni bir çağrı göndermek için yapılır, ve tekrar dış
bekler; ve iç
sona erdiğinde dış
işlemine devam eder. En son biz tekrardış
çerçeveyi çağırırız ve tüm süreç bu şekilde yinelenir.
Şimdi bir sonraki derse geçebilirisniz!