Python fonksiyonları: Argümanlar, varsayılanlar ve lambda örnekleri
Fonksiyonlar, belirli bir görevi yerine getiren, tekrar kullanılabilir kod bloklarıdır. Python'da fonksiyon tanımı ve parametre davranışları hakkında detaylı açıklamalar için resmi belgelere bakabilirsiniz (Python dil tanımı). Bu makalede temel sözdizimi, argüman türleri, varsayılanlar, *args/**kwargs, lambda ifadeleri ve docstring yazımı üzerine pratik örnekler bulacaksınız.
Temel fonksiyon yazımı
Bir fonksiyon def anahtar kelimesiyle tanımlanır. En basit haliyle bir fonksiyon ve çağırma örneği:
def topla(a, b):
"""İki sayıyı toplar ve sonucu döner."""
return a + b
sonuc = topla(3, 5) # 8
Yukarıdaki örnekte a ve b konumsal (positional) parametrelerdir: çağrıda sıraya göre verilirler. Fonksiyonun hemen altında yer alan üç tırnaklı metin docstring olarak adlandırılır ve fonksiyonun ne yaptığını belgelemek için kullanılır (daha fazlası aşağıda).
Konumsal (positional) ve anahtar kelime (keyword) argümanlar
Konumsal argümanlar sıra ile eşlenir; anahtar kelime argümanlar ise parametre adıyla verilir. Her iki türü karıştırmak mümkündür ve genelde okunabilirlik için önemli avantaj sağlar:
def kayit_ekle(isim, soyisim, yas=30):
return f"{isim} {soyisim}, {yas} yaşında"
kayit_ekle("Ayşe", "Demir")
kayit_ekle(soyisim="Kaya", isim="Mehmet", yas=40)
İkinci çağrıda parametre adları kullanıldığı için sıra önemli değildir. Resmi dil tanımında fonksiyon parametrelerinin nasıl eşlendiği ayrıntılı şekilde açıklanmıştır (Python referansı).
Varsayılan argümanlar
Varsayılan argümanlar, fonksiyon çağrılırken belirtilmeyen parametrelere önceden belirlenmiş bir değer sağlar:
def üs_al(x, n=2):
return x ** n
üs_al(3) # 9
üs_al(3, 3) # 27
Önemli bir nokta: Python'da varsayılan argümanların değerlendirilme zamanı fonksiyon tanımlandığı andır; her çağrıda yeniden hesaplanmaz. Bu durum mutable (değiştirilebilir) varsayılan değerlerle beklenmedik sonuçlar verebilir. Örneğin liste gibi bir mutable nesneyi varsayılan yapmak çoğu zaman paylaşılan durum oluşturur:
def ekle(x, liste=[]):
liste.append(x)
return liste
# birden fazla çağrıda liste birikir — beklenmedik olabilir
Bu yüzden güvenli ve yaygın yöntem, varsayılan olarak None kullanıp içinde yeni nesne oluşturmak veya gerekli işlemi yapmak olacaktır:
def ekle(x, liste=None):
if liste is None:
liste = []
liste.append(x)
return liste
Varsayılan argümanların bu davranışı ve değerlendirme zamanı hakkında daha teknik ayrıntılar için resmi dokümantasyona göz atabilirsiniz (Python dil tanımı).
*args ve **kwargs: Belirsiz sayıda argüman
*args konumsal (positional) argümanların tuple halinde yakalanmasını sağlar; **kwargs ise anahtar kelime (keyword) argümanları sözlük (dict) olarak yakalar. Bu mekanizmalar, fonksiyonları esnek hale getirir:
def toplam(*sayilar):
return sum(sayilar)
def yazdir(**alanlar):
for anahtar, deger in alanlar.items():
print(anahtar, deger)
Çağrıda ayrıca bir liste veya sözlüğü açmak için * ve ** operatörleri kullanılabilir:
nums = [1, 2, 3]
toplam(*nums) # 6
kwargs = {"isim": "Ece", "yas": 28}
yazdir(**kwargs)
Parametrelerin fonksiyon tanımındaki sırası önemlidir: önce normal parametreler, sonra *args, sonra keyword-only parametreler (aşağıda) ve sonunda **kwargs gelir. Bu sıralama dil tanımında kurallarla belirlenmiştir (kaynak).
Anahtar kelime-only (keyword-only) argümanlar
Bir '*' işareti fonksiyon imzasında kullanıldığında, ondan sonra gelen parametreler yalnızca anahtar kelime ile verilebilir. Bu, çağrının okunabilirliğini artırmak ve bazı parametreleri zorunlu kılmak için kullanışlıdır:
def kaydet(dosya, *, onay=True):
if onay:
print(f"{dosya} kaydedildi")
Burada onay parametresi yalnızca onay=False gibi anahtar kelimeyle verilebilir; konumsal olarak sağlanamaz.
Lambda ifadeleri (anonim fonksiyonlar)
Lambda ifadeleri tek satırlık anonim fonksiyonlar oluşturmak için uygundur. Kısa, basit dönüşümler veya sıralama anahtarları (key) gibi durumlarda okunurluğu artırabilirler. Resmi eğitim dokümanında lambda kullanımıyla ilgili örnekler bulunmaktadır (Python eğitim rehberi).
double = lambda x: x * 2
double(5) # 10
isimler = ["ali", "Zeynep", "mehmet"]
sorted(isimler, key=lambda s: s.lower())
Lambda kullanımı kısa fonksiyonlar için pratiktir; daha karmaşık mantık için normal def ile isimlendirilmiş fonksiyon tercih edilir.
Docstring: Fonksiyon belgeleme
Docstring, fonksiyonun hemen altında bulunan ve fonksiyonun amacını, parametrelerini ve dönüş değerini açıklayan metindir. İyi yazılmış docstring'ler kodun bakımını ve otomatik dokümantasyon üretimini kolaylaştırır:
def cikar(a, b):
"""İki sayıyı çıkarır.
Parametreler:
a (int): Birinci sayı.
b (int): İkinci sayı.
Döner:
int: a - b değerini döner.
"""
return a - b
Pek çok proje için Google, NumPy veya reStructuredText (reST) stillerinden biri tercih edilir; önemli olan tutarlılıktır.
Pratik ipuçları ve kontrol listesi
- Fonksiyonları kısa ve tek bir amaç için yazın (tek sorumluluk ilkesi).
- Anlamlı isimler kullanın; parametre adları çağrı bağlamında açıklayıcı olsun.
- Mutable nesneler için varsayılan değer olarak None kullanın.
- *args/**kwargs kullanmadan önce alternatifleri değerlendirin; gereksiz genellik okunabilirliği azaltabilir.
- Dokümantasyon için docstring ekleyin ve gerektiğinde tip ipuçları (type hints) kullanın.
- Lambda'ları kısa dönüşümler veya key fonksiyonları için kullanın; karmaşık mantıkta def tercih edin.
- Fonksiyon davranışı ve parametre eşlemesi hakkında daha ayrıntılı bilgi için resmi dokümantasyonu inceleyin (referans, öğretici).
Kısa referans: parametre türleri
| Tür | Açıklama | Örnek |
|---|---|---|
| Konumsal | Sıra ile eşlenen argümanlar | def f(a, b): |
| Anahtar kelime | Parametre adıyla verilen argümanlar | f(b=2, a=1) |
| Varsayılan | Tanımlanmışsa çağrıda belirtilmeyen değeri alır | def g(x=0) |
| *args | Belirsiz sayıda konumsal argüman | def h(*args) |
| **kwargs | Belirsiz sayıda anahtar kelime argüman | def k(**kwargs) |
Bu rehber temel kavramları ve kullanım örneklerini özetlemektedir. Daha derinlemesine dil kuralları ve sınır durumları için Python resmi belgelerine bakmanız yararlı olacaktır (dil tanımı, öğretici). Kod örneklerini geliştirme ortamınızda çalıştırarak deneyim kazanabilirsiniz.