08. Fonksiyonlar

Bir fonksiyon, tek bir ilgili eylemi gerçekleştirmek için kullanılan, yeniden düzenlenebilir bir kod bloğudur. Fonksiyonlar, uygulamanız için daha iyi modülerlik yanı sıra kod yeniden kullanımı sağlar. Print gibi Python fonksiyonlarının yanı sıra kullanıcı tanımlı fonksiyonları oluşturup kullanabiliriz. 

8.1. Bir fonksiyon tanımlama

Gerekli fonksiyonelliği sağlamak için fonksiyonları tanımlayabilirsiniz. Python’da bir fonksiyonu tanımlamak için basit kurallar:

  • Fonksiyon blokları, sırasıyla anahtar kelime def, ardından fonksiyon adı ve parantez (()) içerir.
  • Herhangi bir girdi parametresi veya argümanı bu parantez içine yerleştirilmelidir. Ayrıca bu parantez içindeki parametreleri de tanımlayabilirsiniz.
  • Her fonksiyon içindeki kod bloğu bir kolonla başlar (:) ve girintili olarak oluşturulur.
  • Bir işlevin ilk ifadesi isteğe bağlı bir yorum satırı (“…” içinde) olabilir. Özellikle fonksiyonu açıklamak için kullanılabilir.
  • İfade [return] içeriyorsa, isteğe bağlı olarak fonksiyondan çıkılır. Hiçbir argüman içermeyen bir return veya Return None aynı anlama gelir ve değer döndürmez. Ayrıca, hiç return içermeyen bir fonksiyon tanımlanabilir.

Basitçe söz dizimi:

Basit bir örnek,

beniYaz fonksiyonu dışarıdan bir değer alarak terminal ekranına çıktı üreten bir fonksiyondur. return değeri herhangi bir değer döndürmemektedir, sadece fonksiyon bu satırla birlikte sonlanır.

8.2. Fonksiyon çağırma

Bir fonksiyon tamamlandıktan sonra, başka bir fonksiyondan veya doğrudan Python komutundan ismi ve parametre bilgileri kullanılarak çağrılabilir. Örneğin, üste yazdığımız fonksiyonu çağırmak için,

8.3. Parametre aktarımı: Referans vs. Değer

Python dilinde tüm parametreler (argümanlar) referans olarak iletilir. Bir parametrenin bir fonksiyon içinde ne ifade ettiğini değiştirirseniz, değişiklik aynı zamanda çağırma işlemine geri yansır. Örneğin,

Bir değişkenin referans türü iletildiğinde aslında bellek adresi iletilmiş olur. Modern programlama dillerinin çoğu bu özelliğe dolaylı yollardan destek verir. Örneğin C# ref deyimi ile referans türü atamaya destek verir. Ancak, fonksiyona dışarıdan gelen değere fonksiyon içinde atama işlemi yaptığımızda yeni bir değişkenmiş gibi davranır. Örneğin,

8.4. Fonksiyon Argümanları

Aşağıdaki argüman türlerini kullanarak bir fonksiyonu çağırabilirsiniz:

  • Gerekli argümanlar
  • Anahtar kelime argümanları
  • Varsayılan argümanlar
  • Değişken uzunlukta argümanlar

8.4.1. Gerekli argümanlar

Python’da bir fonksiyona argüman/lar (parametre/ler) sahip ise çağırmak için tüm argümanlara sırasıyla değer gönderilmelidir. Eğer argüman sayısı yetersiz olursa yorumlayıcı hata verir. Örneğin bir önceki bölümdeki fonksiyonu çağıralım,

Argüman girilmediği için hata mesajı verir. Çoğu programlama dili için bu durum geçerlidir. Kullandığım diller arasında sadece JavaScript argüman sayısı konusunda esnek bir yapıya sahiptir.

8.4.2. Anahtar argümanlar

Anahtar argümanları, fonksiyon parametrelerine değer gönderilmesi ile alakalıdır. Değer gönderirken hangi parametre değer gönderdiğinizi belirlersiniz. Bu sayede değerleri belli bir sıra olmadan fonksiyona gönderebilirsiniz. Örneğin,

Anahtar değer kullanmadan değer gönderebiliriz. Ancak bu durumda parametre sıralamasının önemli olduğu unutmayalım. Anahtar yapısı sayesinde daha esnek bir yapıya kavuşabiliriz. Anahtar kullanmadan,

8.4.3. Varsayılan argümanlar

Varsayılan argüman, bir fonksiyonun içindeki argümanlara varsayılan bir değer atamasıdır. Bir argümana varsayılan bir değer atanırsa fonksiyon çağrılırken bu değer boş geçilebilir. Başka bir deyişle argümana değer gönderilmese de varsayılan değer olduğu için kod çalışır. Örneğin,

Varsayılan değer ataması sayesinde fonksiyona eksik değer göndersekte sorun olmaz.

8.4.4. Değişken uzunlukta argümanlar

Fonksiyon tanımlarken argüman sayısı belirsiz olabilir. Bu tür argüman sayısı belli olmayan fonksiyonlar değişken uzunluklu argümanlar olarak adlandırılır. Bu tür bir yapı kurmak için aşağıdaki sözdizimi kullanılır:

Yıldız karakterini (*) görünce C dilini hatırlayan öğrencilerin aklına pointer konusu gelmiştir. Bu yapı sistemimize esneklik kazandırır. İster * karakteri ile başlayan değişkene değer gönderin, isterseniz göndermeyin. Program çalışır. Örneğin standart bir argüman ve * ile başlayan bir argüman tanımlayalım.

arg1 değişkeni değer göndermek zorunda olduğumuzu unutmayın. Ama * ile başlayan değişkenin esnek olduğunu görüyoruz.

8.5. Anonim (İsimsiz) Fonksiyonlar

Bu tür fonksiyonlar def anahtar sözcüğü kullanılmadan oluşturulabilir. Bir isimsiz fonksiyonları oluşturmak için lambda anahtar sözcüğü kullanılır. Bu fonksiyonların temel özellikleri

  • Lambda ile üretilen fonksiyonlar herhangi bir sayıda argüman alabilir, ancak bir ifade şeklinde sadece bir değer döndürür.
  • Lambda fonksiyonları isimsiz oldukları için direkt çağrılamaz çünkü lambda bir ifade gerektirir.
  • Lambda fonksiyonları kendi yerel ad alanlarına sahiptir parametreleri ve sahip olduğu değişken dışında değişkenlere erişemez.

Sözdizimi:

Basit bir örnekle açıklayalım,

Değerlerin toplamı:

Dikkat edilirse, lambda fonsiyonu direkt çağrılamadı. Lambda fonksiyonu 2 argüman sahip ve bir değer döndürüyor. Bu isimsiz fonksiyonun kullanılabilmesi için bir değişkene atanıyor ve bu değişken üzerinden kullanılabiliyor.

8.5. Return ifadesi

return ifadesi fonksiyondan çıkılmasını sağlar. Eğer return ifadesinde hiçbir değer döndürülmüyorsa return None anlamına gelir. Bir anlamda C, C# veya Java’daki void fonksiyonları temsil etmiş olur. Önceki örneklerde hiç bir değer döndürülmemişti, şimdi bir fonksiyondan bir değer döndürelim.

8.6. Değişkenlerin kapsamı

Bir programdaki tüm değişkenlere programın tüm konumlarına erişemeyebilir. Bu tür değişkenler kullandığımız yere bağımlıdır. Python’da iki temel değişken kapsamı vardır.

  • Global (Genel)
  • Local (Yerel)

Bir fonksiyonun altında tanımlanan değişkenlerin yerel kapsamı vardır. Dışarda tanımlanan değişkenlerin ise genel kapsamı vardır. Yerel değişkenlere sadece o fonksiyon içinden ulaşılırken, genel değişkenlere program içinde herhangi bir konumdan ulaşabilirsiniz. Eğer aynı isimde global ve local değişken tanımlanırsa öncelik local değişkenindir. Örneğin,

Aşağıda toplam değişkeni global yapılmıştır.