İşlev Tanımları Üzerine Daha Fazla Bilgi
Önceki Akış Denetimi Sonraki
İşlev Tanımları Üzerine Daha Fazla Bilgi
Değişken sayıda argüman alan işlevler tanımlamak da mümkündür. Bunun için kullanılan üç yöntem olup bunlar birleştirilerek kullanılabilir.
Argüman Değerlerini Önceden Belirleme
İşlev argümanlarına öntanımlı değerler atamak da mümkündür. Böylece çağıran işlev bu argümanları sağlamazsa bunlar önceden belirlenmiş öntanımlı değerlerini alırlar. Örnek:
def onay_al(prompt, denemeler=4, sikayet='Evet veya hayır, lütfen !'):
    while True:
        ok = raw_input(prompt)
        if ok in ('e', 'evet'): return 1
        if ok in ('h', 'hayır'): return 0
        denemeler = denemeler - 1
        if denemeler < 0: raise IOError, 'kararsız kullanıcı'
        print sikayet
Bu işlev onay_al('Programdan çıkmak istiyor musunuz?') ya da onay_al('Dosyayı silmek istiyor musunuz?', 2) şeklinde çağırılabilir.
İşlevin öntanımlı parametreleri işlevin tanımlandığı anda, o an yürürlükte olan etki alanı (scope) içinde değerlendirilirler. Yani:
i = 7
def f(arg = i):
    print arg

i = 6
f()
7
Uyarı
İşlevin öntanımlı parametreleri sadece bir defa değerlendirilirler. Bu durum parametrenin liste gibi değiştirilebilir bir nesne olduğu durumlarda farklılık yaratır. Örneğin aşağıdaki işlev ard arda çağırıldığında argümanlarını biriktirir:
def f(a, L = []):
    L.append(a)
    return L
print f(1)
print f(2)
print f(3)
Bu şu çıktıyı verir:
[1]
[1, 2]
[1, 2, 3]
Eğer öntanımlı parametre değerlerinin birbirini izleyen çağrılarla paylaşılmasını istemiyorsanız yukarıdaki işlevi şu şekilde yazabilirsiniz:
def f(a, L = None):
    if L is None:
        L = []
    L.append(a)
    return L
Anahtar Kelime Argümanlar
İşlevler anahtar kelime = değer şeklindeki anahtar kelimelerle de çağırılabililer. Örneğin şu işlev:
def otomobil(yakit,  hareket=' uçar', model='Anadol'):
    print "Eğer", yakit, "koyarsan bu", model, hareket
aşağıdaki gibi çağırılabilir:
otomobil('roket yakıtı')
otomobil(hareket = 'dans eder', yakıt = 'zeytin yağı' )
otomobil('ispirto', model = 'Kartal')
otomobil('su','bozulur','Şahin')
Şu çağrılar ise hatalıdır:
otomobil()                           # gerekli argüman eksik
otomobil(yakıt = 'su','zeytin yağı') # anahtar kelimeden sonra gelen
                                     # anahtar kelime olmayan argüman
otomobil('mazot', yakit = 'benzin')  # aynı argüman için iki değer
otomobil(sehir = 'İzmir')            # bilinmeyen anahtar kelime
Genel olarak, argüman listesinin başında konuma bağlı argümanlar bulunur ve anahtar kelime argümanlar onları izler; anahtar kelime adları da işlevin parametrelerinden seçilir. Parametrenin öntanımlı değerlerinin olup olmaması önemli değildir. Bir argüman birden fazla değer alamaz; konuma bağlı parametre isimleri aynı çağrıda anahtar kelime olarak kullanılamazlar. İşte bundan dolayı hatalı olan bir örnek:
>>> def function(a):
...     pass
...
>>> function(0, a=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: keyword parameter redefined
Eğer işlev tanımındaki son parametre **isim şeklinde ise bu parametre adları herhangi bir parametre olmayan anahtar kelime şeklindeki argümanların bulunduğu bir sözlük olur. Bu *isim (bu konu Sözlükler (Çağrışımlı Listeler) bölümünde anlatılacaktır.) şeklindeki bir parametre ile de kullanılabilir, ki bu parametre listesi içinde bulunmayan konuma bağlı argümanları içeren bir demet (daha sonra Demetler (tuples) bölümünde incelenecek bir veri türüdür) olur. *isim parametresi **isim parametresinden önce gelmelidir. Buna örnek işlev:
def kasapdukkani(etCinsi,*argumanlar, **anahtarKelimeler):
    print "--", etCinsi, "var mi ?"
    print "-- Maalesef", etCinsi, "kalmadı."
    for arg in argumanlar:
        print arg
    print '-'*40
    anahtarlar = anahtarKelimeler.keys()
    anahtarlar.sort()
    for ak in anahtarlar:
        print ak, ':', anahtarKelimeler[ak]
Şu şekilde çağrılabilir:
kasapdukkani('martı eti',"Çok lezzetli.",
           "Çok satılıyor.",
           musteri = 'Martı Murat',
           kasap = 'Dev İsmail')
ve doğal olarak şu çıktıyı verir:
-- martı eti var mi ?
-- Maalesef martı eti kalmadı.
Çok lezzetli.
Çok satılıyor.
----------------------------------------
kasap : Dev İsmail
musteri : Martı Murat
anahtarKelimeler isimli sözlüğün içeriği yazdırılmadan önce anahtar kelime isimleri listesinin sort() yönteminin çağırıldığına dikkat edin; bu yapılmaz ise argümanların hangi sıra ile yazılacağı tanımlanmamış olur.
Keyfî Argüman Listeleri
Son olarak, en ender kullanılan seçenek de keyfî sayıdaki argümanla çağrılabilen bir işlev tanımlamaktır. Bu argümanlar bir demet (değişmez liste [tuple]) içine alınırlar. Keyfî argüman listesinden önce sıfır ya da daha fazla normal argüman bulunabilir. Örnek:
def fprintf(file, format, *args):
    file.write(format % args)
Lambda Biçemli İşlevler
Yoğun istek üzerine işlevsel dillerde ve Lisp'te bulunan bazı özellikler Python'a eklenmiştir. lambda anahtar kelimesi ile küçük anonim işlevler yazılabilir. İşte iki argümanının toplamını geri döndüren bir işlev: lambda a, b: a+b.
Lambda işlevleri bir işlev nesnesine ihtiyaç duyulan her yerde kullanılabilirler. Sözdizim (syntax) açısından bunlar tek bir ifade ile sınırlandırılmışlardır. Anlambilim (semantics) açısından ise normal işlev tanımlamasına getirilen bir sözdizim güzelliğidir. İç içe tanımlanmış işlevlerde olduğu gibi lambda işlevleri de kendilerini kapsayan etki alanindaki değişkenlere erişebilirler:
>>> def artirici_yap(n):
...     return lambda x: x + n
...
>>> f = artirici_yap(42)
>>> f(0)
42
>>> f(1)
43
Belgelendirme Dizgeleri
Belgelendirmede kullanılan dizgelerin şekli ve içeriği ile ilgili şartlar yeni yeni oluşmaktadır.
İlk satır daima nesnenin amacının kısa ve öz tanımı olmalıdır. Kısa olması için, nesnenin adından ve türünden bahsedilmemeli; zira bunlar başka yollarla da öğrenilebilir. Bu satır büyük harf ile başlayıp nokta ile bitmelidir.
Eğer belgelendirme dizgesinde birden fazla satır var ise ikinci satır boş olup özet ile açıklamamın devamını birbirinden ayırmalıdır. Diğer satırlar bir ya da daha fazla satır olabilir. Bunlarla nesnenin özellikleri, çağrı şekilleri, yan etkileri vs. açıklanabilir.
Python çözümleyicisi (parser) çok satırlı dizgelerdeki girintileri yok etmez; yani belgeleri işleyen programlar gerekirse bunları atabilirler. İlk satırdan sonra gelen ve boş olmayan ilk satırdaki girinti miktarı belgelendirme dizgesinin devamındaki girinti miktarını belirler. Bu girinti miktarına ``eşdeğer'' boşluk diğer satırların başından atılır. Daha az girintili satırlar olmamalı; ama olursa da bunların önündeki boşluğun tamamı atılmalı. Boşluğun eşdeğerliği sekmelerin genişletilmesinden (1 sekme = 8 boşluk) sonra sınanmalıdır.
İşte çok satırlı bir belgelendirme dizgesi örneği:
>>> def benimFonksiyon():
...     """Sadece belgeler.
...
...     Başka birşey yapmaz. Gerçekten !.
...     """
...     pass
...
>>> print benimFonksiyon.__doc__
Sadece belgeler.

   Başka birşey yapmaz. Gerçekten !
Önceki Üst Ana Başlık Sonraki
İşlev Tanımlama Başlangıç Veri Yapıları
Bir Linux Kitaplığı Sayfası