10: def

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 (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:

  1. İ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 de return x*x işlemini  x argümanının 10  sayısı ile karşılandığını gözönünde turarak yapar. Böylece x*x işlemi 100 sonucunu verir.
  2. İ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 olarak  x argümanına 2 sayısını verdiğimizde fonksiyon gövdesini çalıştırır ve 4 sonucunu alırız.
    • Sonra dış kısım değerlendirilir, square(2) bize 4 sonucunu verdiği için şimdi argüman 4 olur: square(4). Bu da çıktı olarak 16 sonucunu yazdırır.

Dört Genel Hata

Birfonksiyon tanımlanırken yapılan hatalardan biri return ifadesini kullanmayı unutmaktır.

Example
Hata 1: returnifadesini unutmak

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:
Example: Yan etki ve returnsüz ifade

Başka bir hata ise kodu yazarken girintileri koymamaktır, IndentationError hatası ile sonuçlanır.

Example
Hata 2: Girintiyi unutmak

2. derste gördüğümüz gibi fonksiyonu gerekenden fazla veya az argümanla çağırmak da hataya yol açar.

Example
Hata 3: Fazla argümanla çağırmak

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.

Example
Hata 4: yanlış isim

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

Coding Exercise: Cubism
 cube(n) adlı bir fonksiyon tanımlayın, input olarak  n tek sayısını alsın ve çıktı olarak  n × n × n işleminin sonucunu versin.
Enter testing statements like print(myfunction("test argument")) below.

İ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:

Multiple Choice Exercise: In-n-Out
Bir sonraki programın çıktısı ne olur?

def f():          # 0 argümanlı fonksiyon
print("in f")
print("not in f")
f() # f fonksiyonunu çağırıyoruz
Doğru! 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:

\textrm{çevre = en + boy + en + boy}

Örnek için yandaki şekle bakınız.



Coding Exercise: Dörtgen
Bir dörtgenin çevresini hesaplamak için dörtgeninÇevresi(en, boy) fonksiyonu yazınız.
Enter testing statements like print(myfunction("test argument")) below.

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  şeklinde yeni oluşturuldu) de bulunuyor. dış çerçeve,  çerçeve tam olarak sonlanana kadar bekler ve daha sonra  dış kaldığı yerden devam eder.  Bu,  çerçeveye yeni bir çağrı göndermek için yapılır, ve tekrar  dış bekler; ve  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!