koddla

Yazılımcıları bilgi ile güçlendirir.

Python101 – Gelişmiş Fonksiyon Örnekleri

Bazıları için bu bölümü yararlı olabilir, ancak bir kısım yeni başlayan için ise kafa karıştırıcı olacaktır. Bu bölüm sizin için de kafa karıştırıcı olursa atlayabilirsiniz. Şimdi aşağıdaki program için bir okuma yapalım:

def mult(a, b):
    if b == 0:
        return 0
    rest = mult(a, b - 1)
    value = a + rest
    return value
result = mult(3, 2)
print("3 * 2 = ", result)

Temel olarak bu program pozitif bir tamsayı çarpma fonksiyonu oluşturur (bu, yerleşik çarpma işlevinden çok daha yavaştır) ve daha sonra bu fonksiyonu fonksiyonun kullanımıyla gösterir. Bu program aynı zamanda özyineleme kullanımını da gösterir; bu, bir çıkış koşulu karşılanana kadar kendisini tekrar tekrar çağıran bir işlev olan bir yineleme biçimidir (recursion). Çarpma ile aynı sonucu vermek için tekrarlanan eklemeler kullanır: örneğin 3 + 3 (ilave işlemi) 3 * 2 (çarpma işlemi) ile aynı sonucu verir.

Soru: Programın yaptığı ilk şey nedir?

Cevap: Yapılan ilk şey, mult işlevinin tanımlanmasıdır:

def mult(a, b):
    if b == 0:
        return 0
    rest = mult(a, b - 1)
    value = a + rest
    return value

Bu, iki parametre alan ve çağırıldığında bir değer döndüren bir işlevdir. Daha sonra bu işlev çalıştırılabilir.

Sonra?

İşlevden sonraki satır çalıştırılır. result = mult(3, 2)

Bu satır ne işe yarıyor?

Bu satır, result değişkenine mult(3, 2) çağrısının dönüş değerini atar.

Peki mult(3, 2) ile geri dönen sonuç nedir?

Bunu öğrenmek için mult işlevini izlemeliyiz.

Sonra?

a değişkeni kendisine atanan 3 değerini alır ve b değişkeni de kendisine atanan 2 değerini alır.

Peki ya sonra?

if b == 0: satırı çalıştırılır. b‘nin değeri 2 olduğundan, bu yanlıştır, bu nedenle return 0 satırı atlanır.

Peki sonra ne oluyor?

rest = mult(a, b - 1) satırı çalıştırılıyor. Bu satır rest yerel değişkenine mult(a, b - 1) değerine atar. a değeri 3 ve b değeri 2 olduğundan işlev çağrısı mult(3,1) olur.

Peki mult(3, 1)‘in değeri nedir?

İşlevi 3 ve 1 parametreleriyle çalıştırıyoruz.

Sonra ne oluyor?

İşlevin yeni çalıştırmasındaki yerel değişkenler, a değişkenine 3 ve b değişkenine ise 1 değerini atayacak şekilde ayarlanır. Bunlar yerel değerler olduğundan, önceki tanımları etkilemezler.

Peki ya sonra?

b değişkeni 1 değerine sahip olduğundan if deyimi false olur, bu nedenle bir sonraki satır rest = mult(a, b - 1) olur.

Bu satır ne işe yarıyor?

Bu satır rest değişkenine mult(3, 0) değerini atayacaktır.

Peki bu değer nedir?

Bunu öğrenmek için işlevi bir kez daha çalıştırmamız gerekecek. Bu kez a değişkeni 3 ve b değişkeni 0 değerlerini alıyor.

Peki sonra ne olacak?

Çalıştıracak ilk satır if b == 0: oluyor. b, 0 değerine sahiptir, bu nedenle çalıştıracak bir sonraki satır return 0 olur.

Peki return 0 satırı ne işe yarıyor?

Bu satır işlevin 0 değerini döndürür.

Sonra?

Artık mult(3, 0)‘ün 0 değerine sahip olduğunu biliyoruz. Şimdi işlevi 3 ve 0 parametreleriyle çalıştırdığımız için rest = mult(a, b - 1) satırının ne yaptığını biliyoruz. mult(3, 0)‘ı çalıştırmayı bitirdik ve şimdi mult(3, 1)‘i çalıştırmaya geri döndük. rest değişkene 0 değeri atanır.

Sırada hangi satır var?

Sırada value = a + rest satırı var. İşlevin bu çalışmasında a = 3, rest = 0 ve value = 3.

Sonra ne olacak?

return value satırı çalıştırılıyor. Bu, işlevden 3 döndürür. Aynın zamanda, işlevin mult(3, 1) çalışmasından da çıkar. return çağrıldıktan sonra, mult(3, 2) çalışmasına geri dönüyoruz.

Neredeydik? mult(3, 2)

a = 3 ve b = 2 değişkenlerimiz vardı ve rest = mult(a, b - 1) satırını inceliyorduk.

Peki şimdi ne olacak?

rest değişkenine 3 atanır. Sonraki satır value = a + rest ile value‘ye 3 + 3 yani 6 değeri atanır.

Peki şimdi ne olacak?

Bir sonraki satır çalışır. Bu, işlevden 6 sayısını döndürür. Şimdi result değişkenine 6 değerini atayacak result = mult(3, 2) satırını çalıştırmaya geri döndük.

Sonra ne olacak?

İşlevde sonraki satır çalıştırılır: print("3 * 2 = ", result)

Peki bu ne işe geliyor?

Ekrana 3 * 2 = yazdırılır ve değeri 6’dır. Yazdırılan satırın tamamı: 3 * 2 = 6

Tam olarak ne oluyor?

Temel olarak, iki sayının çarpımını hesaplamak için iki gerçeği kullandık. Birincisi, 0’ın herhangi bir sayı ile çarpımının 0 olmasıdır (x * 0 = 0). İkincisi, bir sayının başka bir sayı ile çarpımının ilk sayıya ilk sayı ile ikinci sayının bir eksiğinin çarpımının eklenmesidir. (x * y = x + x * (y - 1)). Yani olan şey ilk olarak 3 * 2‘nin 3 + 3 * 1‘e dönüştürülmesidir. Sonra 3 * 1, 3 + 3 * 0‘a dönüştürülür. Burada 3 * 0‘ın 0 olduğunu biliyoruz. O zaman diğer işlemleri de sırayla yaparız ve sonucu 6 olarak buluruz.

Yani her şey aşağıdaki gibi yürüyor:

mult(3, 2)
3 + mult(3, 1)
3 + 3 + mult(3, 0)
3 + 3 + 0
3 + 3
6

Özyineleme

Bir problemin çözümünde o problemin daha küçük bir sürümünü çözerek çözüme ulaşan yapılar özyinelemeli olarak adlandırılır. Özyineleme, bu bölümdeki örneklerde olduğu gibi, kendisini çağıran bir işlev tanımlanarak gerçekleştirilir. Tüm sorun yerine sorunun sonraki adımını aynı anda göz önünde bulundurmak yeterli olabileceğinden, bu yaklaşım programlama görevlerine çözümlerin uygulanmasını kolaylaştırır. Bazı matematiksel kavramları basit, okunması kolay kodla ifade etmeye izin verdiği için de yararlıdır.

Özyineleme ile çözülebilecek herhangi bir sorun döngülerle yeniden uygulanabilir. İkincisini kullanmak genellikle daha iyi performans sağlar. Ancak döngüleri kullanarak eşdeğer uygulamalar genellikle doğru şekilde yapılması daha zordur.

Çarpma örneği aklınıza yatmadıysa, faktöryel örneğini okumayı deneyin;

Örnekler

factorial.py

#faktoriyel hesaplayan bir fonksiyon tanımlar

def factorial(n):
    if n == 0:
        return 1
    if n<0:
        return "Hata, negatif değerlerin faktoriyeli olmaz!"
    return n * factorial(n - 1)

print("2! =", factorial(2))
print("3! =", factorial(3))
print("4! =", factorial(4))
print("5! =", factorial(5))
print("-3! =", factorial(-3))

Çıktı:

2! = 2
3! = 6
4! = 24
5! = 120
-3! = Hata, negatif değerlerin faktoriyeli olmaz!

geri_sayim.py

def geri_sayim(n):
    print(n)
    if n > 0:
        return geri_sayim(n-1)

geri_sayim(5)

Çıktı:

5
4
3
2
1
0

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top