Herhangi bir değere kadar Fibonacci serisi yazan bir işlev yazalım: >>> def fib(n): # n'e kadar Fibonacci serisini yazdır ... "n'e kadar Fibonacci serisini yazdır" ... a, b = 0, 1 ... while b < n: ... print b, ... a, b = b, a+b ... >>> # Tanımladığımız işlevi cağıralım: ... fib(2000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 def anahtar kelimesi bir işlev tanımını başlatır. Bu deyimden sonra bir işlev adı ve parantez icinde parametreler yazılır. İşlevin govdesini oluşturan program satırları sonraki satırdan itibaren girintili olarak yazılırlar. İşlev govdesinin ilk satırı bir dizge de olabilir; bu dizge işlevin belgelenmesinde kullanılır (docstring). İşlevlerin belgelenmesinde kullanılan dizgeleri (docstring) otomatik olarak cevrim ici ya da basılı belgeler oluşturmak icin kullanan yazılımlar vardır. Ayrıca bazı geliştirme ortamları bunları program yazarken kolaylık sağlaması icin etkileşimli olarak programcıya sunarlar. Yazdığınız işlevlere bunları eklemeyi bir alışkanlık haline getirmeniz faydalı olur. Bir işlevin cağrılması (calıştırılması) bu işlevdeki yerel değişkenlerin olduğu bir simge tablosu oluşturur. İşlev icerisinde butun değer atama işlemlerinde değerler yerel simge tablosuna kaydedilir. Bir değişkene başvuru durumunda ise once yerel (local), sonra genel (global) ve en son yerleşik (built-in) simge tablosunda arama yapılır. Bu yuzden genel değişkenlere doğrudan değer atama yapılamaz (eğer global ifadesi icinde kullanılmamışlar ise); ancak bunlara başvuru yapılabilir (reference). İşlev cağırıldığında işlevin parametreleri yerel simge tablosuna eklenirler; yani parametreler işleve değeri ile cağrı (call by value) kullanılarak iletilirler (yani parametreye yapılan değişiklikler yereldir, cağıran işlevdeki argumanlarda bir değişme olmaz). [85] Bir işlev başka bir işlevi cağırdığında bu cağrı icin yeni bir yerel simge tablosu oluşturulur. Bir işlev tanımı işlev adının yururlukte olan simge tablosuna eklenmesine sebep olur. İşlevin adı yorurumlayıcı tarafından kullanıcı tanımlı işlev veri turu olarak tanınır. Bu değer başka bir isime atanabilir ve bu da bir işlev olarak kullanılabilir. Bu genel bir isim değiştirme yolu olabilir: >>> fib >>> f = fib # f de fib işlevi olur >>> f(100) 1 1 2 3 5 8 13 21 34 55 89 fib'in bir işlev olmayıp bir yordam (procedure) olduğunu duşunebilirsiniz. Python'da yordamlar, cağıran işleve değer geri dondurmeyen işlevlerdir. Aslında yordamlar da bir değer geri dondururler, ama bu sıkıcı bir konudur. Bu değere None denir ve yerleşik bir değişkendir. Yorumlayıcı yazılacak tek değer bu ise normalde None yazmaz. Bunu gormeyi cok istiyorsanız şunu deneyin: >>> print fib(0) None Fibonacci serisini yazdırmak yerine, bunu bir liste şeklinde geri donduren işlev yazmak basittir: >>> def fib2(n): # n e kadar fibonacci serisi geri dondurur ... " n e kadar fibonacci serisi iceren liste geri dondurur" ... sonuc = [] ... a, b = 0, 1 ... while b < n: ... sonuc.append(b) # değeri listeye ekle ... a, b = b, a+b ... return sonuc ... >>> f100 = fib2(100) # işlevi cağır >>> f100 # sonucu yazdır [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] Bu ornekte de bazı yeni Python ozelliklerini goruyoruz: return deyimi bir işlevden değer geri dondurur. Parametresi olmayan bir return deyimi None geri dondurur. Sona eren bir yordam (procedure) da None geri dondurur. sonuc.append(b) ifadesi sonuc liste nesnesinin bir yontemini cağırmaktadır. Bir yontem bir nesneye `ait olan' ve nesne.yontemAdı şeklinde adlandırılan bir işlevdir. nesne.yontemAdı ifadesinde nesne herhangi bir nesne (bir ifade de olabilir) ve yontemAdı da nesnenin turune bağlı bir yontemdir. Farklı veri turleri farklı yontemlere sahiptirler. Farklı veri turlerinin ayni isimli yontemleri olabilir. Sonraki bolumlerde anlatılacağı gibi, kendi veri turlerinizi ve yontemlerinizi oluşturmanız mumkundur. Yukarıdaki ornekte gorulen append() yontemi liste nesneleri icin tanımlıdır ve bir listenin sonuna yeni elemanlar ekler. Bu ornekte bu sonuc = sonuc + [b] ifadesinin yaptığını yapar; ancak daha verimlidir.
__________________