Değişken sayıda arguman alan işlevler tanımlamak da mumkundur. Bunun icin kullanılan uc yontem olup bunlar birleştirilerek kullanılabilir. Arguman Değerlerini Onceden Belirleme İşlev argumanlarına ontanımlı değerler atamak da mumkundur. Boylece cağıran işlev bu argumanları sağlamazsa bunlar onceden belirlenmiş ontanımlı değerlerini alırlar. Ornek: def onay_al(prompt, denemeler=4, sikayet='Evet veya hayır, lutfen !'): 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 cıkmak istiyor musunuz?') ya da onay_al('Dosyayı silmek istiyor musunuz?', 2) şeklinde cağırılabilir. İşlevin ontanımlı parametreleri işlevin tanımlandığı anda, o an yururlukte olan etki alanı (scope) icinde değerlendirilirler. Yani: i = 7 def f(arg = i): print arg i = 6 f() 7 Uyarı İşlevin ontanı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. Orneğin aşağıdaki işlev ard arda cağırıldığında argumanlarını biriktirir: def f(a, L = []): L.append(a) return L print f(1) print f(2) print f(3) Bu şu cıktıyı verir: [1] [1, 2] [1, 2, 3] Eğer ontanımlı parametre değerlerinin birbirini izleyen cağ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 Argumanlar İşlevler anahtar kelime = değer şeklindeki anahtar kelimelerle de cağırılabililer. Orneğin şu işlev: def otomobil(yakit, hareket=' ucar', model='Anadol'): print "Eğer", yakit, "koyarsan bu", model, hareket aşağıdaki gibi cağırılabilir: otomobil('roket yakıtı') otomobil(hareket = 'dans eder', yakıt = 'zeytin yağı' ) otomobil('ispirto', model = 'Kartal') otomobil('su','bozulur','Şahin') Şu cağrılar ise hatalıdır: otomobil() # gerekli arguman eksik otomobil(yakıt = 'su','zeytin yağı') # anahtar kelimeden sonra gelen # anahtar kelime olmayan arguman otomobil('mazot', yakit = 'benzin') # aynı arguman icin iki değer otomobil(sehir = 'İzmir') # bilinmeyen anahtar kelime Genel olarak, arguman listesinin başında konuma bağlı argumanlar bulunur ve anahtar kelime argumanlar onları izler; anahtar kelime adları da işlevin parametrelerinden secilir. Parametrenin ontanımlı değerlerinin olup olmaması onemli değildir. Bir arguman birden fazla değer alamaz; konuma bağlı parametre isimleri aynı cağrıda anahtar kelime olarak kullanılamazlar. İşte bundan dolayı hatalı olan bir ornek: >>> def function(a): ... pass ... >>> function(0, a=0) Traceback (most recent call last): File "", 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 argumanların bulunduğu bir sozluk olur. Bu *isim (bu konu Sozlukler (Cağrışımlı Listeler) bolumunde anlatılacaktır.) şeklindeki bir parametre ile de kullanılabilir, ki bu parametre listesi icinde bulunmayan konuma bağlı argumanları iceren bir demet (daha sonra Demetler (tuples) bolumunde incelenecek bir veri turudur) olur. *isim parametresi **isim parametresinden once gelmelidir. Buna ornek 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 cağrılabilir: kasapdukkani('martı eti',"Cok lezzetli.", "Cok satılıyor.", musteri = 'Martı Murat', kasap = 'Dev İsmail') ve doğal olarak şu cıktıyı verir: -- martı eti var mi ? -- Maalesef martı eti kalmadı. Cok lezzetli. Cok satılıyor. ---------------------------------------- kasap : Dev İsmail musteri : Martı Murat anahtarKelimeler isimli sozluğun iceriği yazdırılmadan once anahtar kelime isimleri listesinin sort() yonteminin cağırıldığına dikkat edin; bu yapılmaz ise argumanların hangi sıra ile yazılacağı tanımlanmamış olur. Keyf&#238; Arguman Listeleri Son olarak, en ender kullanılan secenek de keyf&#238; sayıdaki argumanla cağrılabilen bir işlev tanımlamaktır. Bu argumanlar bir demet (değişmez liste [tuple]) icine alınırlar. Keyf&#238; arguman listesinden once sıfır ya da daha fazla normal arguman bulunabilir. Ornek: def fprintf(file, format, *args): file.write(format % args) Lambda Bicemli İşlevler Yoğun istek uzerine işlevsel dillerde ve Lisp'te bulunan bazı ozellikler Python'a eklenmiştir. lambda anahtar kelimesi ile kucuk anonim işlevler yazılabilir. İşte iki argumanının toplamını geri donduren bir işlev: lambda a, b: a+b. Lambda işlevleri bir işlev nesnesine ihtiyac duyulan her yerde kullanılabilirler. Sozdizim (syntax) acısından bunlar tek bir ifade ile sınırlandırılmışlardır. Anlambilim (semantics) acısından ise normal işlev tanımlamasına getirilen bir sozdizim guzelliğidir. İc ice 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 iceriği ile ilgili şartlar yeni yeni oluşmaktadır. İlk satır daima nesnenin amacının kısa ve oz tanımı olmalıdır. Kısa olması icin, nesnenin adından ve turunden bahsedilmemeli; zira bunlar başka yollarla da oğrenilebilir. Bu satır buyuk harf ile başlayıp nokta ile bitmelidir. Eğer belgelendirme dizgesinde birden fazla satır var ise ikinci satır boş olup ozet ile acıklamamın devamını birbirinden ayırmalıdır. Diğer satırlar bir ya da daha fazla satır olabilir. Bunlarla nesnenin ozellikleri, cağrı şekilleri, yan etkileri vs. acıklanabilir. Python cozumleyicisi (parser) cok 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 onundeki 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 cok satırlı bir belgelendirme dizgesi orneği: >>> def benimFonksiyon(): ... """Sadece belgeler. ... ... Başka birşey yapmaz. Gercekten !. ... """ ... pass ... >>> print benimFonksiyon.__doc__ Sadece belgeler. Başka birşey yapmaz. Gercekten !
__________________