🐍 0.3: Python Fonksiyonlar

Algoritmalar ve Veri Yapıları Dersi - İnteraktif Konu Anlatımı

✅ Python yorumlayıcısı hazır! Kodları çalıştırabilirsiniz.

📖 Fonksiyon Nedir?

Fonksiyon, belirli bir görevi yerine getiren, yeniden kullanılabilir kod bloklarıdır. Fonksiyonlar sayesinde kodlarımızı daha organize, okunabilir ve bakımı kolay hale getiririz.

🎯 Fonksiyonların Faydaları:
  • Kod Tekrarını Önler: Aynı işlemi farklı yerlerde kullanmak için kodu kopyalamaya gerek kalmaz
  • Modüler Yapı: Büyük programları küçük parçalara böleriz
  • Kolay Bakım: Bir değişikliği sadece fonksiyon içinde yaparız
  • Okunabilirlik: Kod daha anlaşılır ve düzenli olur
  • Test Edilebilirlik: Her fonksiyonu ayrı ayrı test edebiliriz

📊 Fonksiyon Anatomisi

def fonksiyon_adi(parametre1, parametre2):
    """Docstring - fonksiyonun açıklaması"""
    # Fonksiyon gövdesi
    sonuc = parametre1 + parametre2
    return sonuc
🔑 def

Fonksiyon tanımlama anahtar kelimesi

📛 İsim

Fonksiyonun benzersiz adı

📥 Parametreler

Fonksiyona gönderilen değişkenler

📤 Return

Fonksiyonun döndürdüğü değer

⚡ Önemli Terimler:
Parametre: Fonksiyon tanımında parantez içinde belirtilen değişkenler
Argüman: Fonksiyonu çağırırken gönderdiğimiz gerçek değerler
Return: Fonksiyonun geri döndürdüğü değer
def: Fonksiyon tanımlamak için kullanılan anahtar kelime

🔧 Fonksiyon Tanımlama ve Çağırma

Basit Bir Fonksiyon

En basit haliyle, hiç parametre almayan ve değer döndürmeyen bir fonksiyon:

Python Kodu
def selamla():
    """Bu fonksiyon basit bir selamlama yapar"""
    print("Merhaba Dünya!")
    print("Python öğreniyorum!")

# Fonksiyonu çağırma
selamla()
print("---")
selamla()  # Birden fazla kez çağırabiliriz

Parametreli Fonksiyonlar

Fonksiyonlara dışarıdan veri göndererek daha esnek hale getirebiliriz:

Python Kodu
def selamla_kisi(isim):
    """Belirtilen kişiye selamlar"""
    print(f"Merhaba {isim}!")
    print(f"{isim}, nasılsın?")

# Farklı argümanlarla çağırma
selamla_kisi("Ahmet")
print("---")
selamla_kisi("Ayşe")
print("---")
selamla_kisi("Mehmet")

Return ile Değer Döndürme

return anahtar kelimesi, fonksiyonun bir değer döndürmesini sağlar:

flowchart LR A[Fonksiyon Çağırma] --> B[Fonksiyon Çalışır] B --> C{Return var mı?} C -->|Evet| D[Değer Döndür] C -->|Hayır| E[None Döndür] D --> F[Değer Kullanılabilir] E --> F style A fill:#667eea,color:#fff style D fill:#28a745,color:#fff style E fill:#ffc107,color:#333
Python Kodu
def topla(a, b):
    """İki sayıyı toplar ve sonucu döndürür"""
    sonuc = a + b
    return sonuc

def kare_al(sayi):
    """Bir sayının karesini döndürür"""
    return sayi * sayi

# Return değerlerini kullanma
toplam = topla(15, 25)
print(f"Toplam: {toplam}")

kare = kare_al(7)
print(f"7'nin karesi: {kare}")

# Return değerini doğrudan kullanma
print(f"5 + 8 = {topla(5, 8)}")
print(f"12'nin karesi: {kare_al(12)}")

# Return değerini başka işlemlerde kullanma
sonuc = topla(10, 20) + kare_al(5)
print(f"10+20 + 5^2 = {sonuc}")
⚠️ Dikkat: return olmadan bir fonksiyon None döndürür. print() ile return farklıdır! print() sadece ekrana yazar, return ise değeri fonksiyondan çıkartır.

🎨 Örnek: Dizide Minimum Bulma

📋 Flowchart (Akış Şeması)

flowchart TD A([BAŞLA]) --> B[liste parametresini al] B --> C[min = liste'#91;0'#93;] C --> D[i = 0] D --> E{i < liste uzunluğu?} E -->|Evet| F{liste'#91;i'#93; < min?} F -->|Evet| G[min = liste'#91;i'#93;] F -->|Hayır| H[i = i + 1] G --> H H --> E E -->|Hayır| I[return min] I --> J([BİTİR]) style A fill:#667eea,color:#fff style J fill:#667eea,color:#fff style I fill:#28a745,color:#fff style G fill:#f093fb,color:#fff style E fill:#ffc107,color:#333 style F fill:#17a2b8,color:#fff

📝 Pseudocode (Sözde Kod)

Pseudocode
FUNCTION min_bul(liste):
    min ← liste[0]
    
    FOR her eleman IN liste:
        IF eleman < min:
            min ← eleman
        END IF
    END FOR
    
    RETURN min
END FUNCTION

// Kullanım
sayilar ← [45, 23, 67, 12, 89]
sonuc ← min_bul(sayilar)
PRINT sonuc

🐍 Python Kodu

Python Kodu
def min_bul(liste):
    """Listedeki minimum değeri bulur"""
    if len(liste) == 0:
        return None
    
    min_deger = liste[0]
    
    for eleman in liste:
        if eleman < min_deger:
            min_deger = eleman
    
    return min_deger

# Test edelim
sayilar1 = [45, 23, 67, 12, 89, 34]
sayilar2 = [100, 50, 75, 25, 90]
sayilar3 = [-5, -10, -3, -20, -1]

print(f"Liste 1: {sayilar1}")
print(f"Minimum: {min_bul(sayilar1)}")
print()
print(f"Liste 2: {sayilar2}")
print(f"Minimum: {min_bul(sayilar2)}")
print()
print(f"Liste 3: {sayilar3}")
print(f"Minimum: {min_bul(sayilar3)}")

💪 Daha Fazla Algoritma Örnekleri

Ortalama Hesaplama

Python Kodu
def ortalama_hesapla(liste):
    """Listedeki sayıların ortalamasını hesaplar"""
    if len(liste) == 0:
        return 0
    
    toplam = 0
    for sayi in liste:
        toplam += sayi
    
    ortalama = toplam / len(liste)
    return ortalama

# Test
notlar1 = [85, 90, 78, 92, 88]
notlar2 = [60, 70, 65, 80, 75]

print(f"Notlar 1: {notlar1}")
print(f"Ortalama: {ortalama_hesapla(notlar1):.2f}")
print()
print(f"Notlar 2: {notlar2}")
print(f"Ortalama: {ortalama_hesapla(notlar2):.2f}")

Linear Search (Doğrusal Arama)

flowchart TD A([BAŞLA]) --> B[liste, aranan al] B --> C[i = 0] C --> D{i < liste uzunluğu?} D -->|Evet| E{liste i == aranan?} E -->|Evet| F[return i] E -->|Hayır| G[i = i + 1] G --> D D -->|Hayır| H[return -1] F --> I([BİTİR]) H --> I style A fill:#667eea,color:#fff style I fill:#667eea,color:#fff style F fill:#28a745,color:#fff style H fill:#dc3545,color:#fff
Python Kodu
def linear_search(liste, aranan):
    """
    Listedeki bir elemanı arar ve indeksini döndürür.
    Bulunamazsa -1 döndürür.
    """
    for i in range(len(liste)):
        if liste[i] == aranan:
            return i  # Bulundu, indeksini döndür
    
    return -1  # Bulunamadı

# Test
isimler = ["Ali", "Ayşe", "Mehmet", "Fatma", "Ahmet"]
sayilar = [10, 25, 30, 45, 50, 75]

print(f"İsimler: {isimler}")
print(f"'Mehmet' aranıyor...")
indeks = linear_search(isimler, "Mehmet")
if indeks != -1:
    print(f"Bulundu! İndeks: {indeks}")
else:
    print("Bulunamadı!")

print()
print(f"'Zeynep' aranıyor...")
indeks = linear_search(isimler, "Zeynep")
if indeks != -1:
    print(f"Bulundu! İndeks: {indeks}")
else:
    print("Bulunamadı!")

print()
print(f"Sayılar: {sayilar}")
print(f"45 aranıyor: İndeks = {linear_search(sayilar, 45)}")
print(f"100 aranıyor: İndeks = {linear_search(sayilar, 100)}")

Asal Sayı Kontrolü

Python Kodu
def asal_mi(sayi):
    """
    Bir sayının asal olup olmadığını kontrol eder
    Return: True (asal) veya False (asal değil)
    """
    if sayi < 2:
        return False
    
    if sayi == 2:
        return True
    
    if sayi % 2 == 0:
        return False
    
    # 3'ten başlayarak sayının kareköküne kadar kontrol et
    for i in range(3, int(sayi**0.5) + 1, 2):
        if sayi % i == 0:
            return False
    
    return True

def asal_sayilari_listele(baslangic, bitis):
    """Verilen aralıktaki asal sayıları listeler"""
    asal_liste = []
    for sayi in range(baslangic, bitis + 1):
        if asal_mi(sayi):
            asal_liste.append(sayi)
    return asal_liste

# Test
print("Asal mı kontrolleri:")
test_sayilar = [2, 3, 4, 5, 10, 17, 19, 20, 23, 25]
for sayi in test_sayilar:
    sonuc = "ASAL" if asal_mi(sayi) else "ASAL DEĞİL"
    print(f"{sayi}: {sonuc}")

print("\n1-50 arası asal sayılar:")
asallar = asal_sayilari_listele(1, 50)
print(asallar)
print(f"Toplam {len(asallar)} adet asal sayı var")

🔄 Pass by Value vs Pass by Reference

🧠 Önemli Kavram:
Python'da değişkenler iki şekilde davranır:
  • Immutable (Değiştirilemez): int, float, str, tuple → Pass by Value gibi davranır
  • Mutable (Değiştirilebilir): list, dict, set → Pass by Reference gibi davranır

Immutable Tipler (Sayılar, String'ler)

Python Kodu
def sayi_degistir(x):
    """Sayıyı değiştirmeye çalışır"""
    print(f"Fonksiyon içinde (önce): x = {x}")
    x = x + 10
    print(f"Fonksiyon içinde (sonra): x = {x}")
    return x

# Ana program
sayi = 5
print(f"Fonksiyon öncesi: sayi = {sayi}")
sonuc = sayi_degistir(sayi)
print(f"Fonksiyon sonrası: sayi = {sayi}")
print(f"Return değeri: sonuc = {sonuc}")
print("\nGöründüğü gibi, orijinal 'sayi' değişmedi!")

Mutable Tipler (Listeler) - Pass by Reference

Python Kodu
def liste_degistir(liste):
    """Listeyi değiştirir"""
    print(f"Fonksiyon içinde (önce): {liste}")
    liste.append(99)
    liste[0] = 999
    print(f"Fonksiyon içinde (sonra): {liste}")

# Ana program
sayilar = [1, 2, 3, 4, 5]
print(f"Fonksiyon öncesi: {sayilar}")
liste_degistir(sayilar)
print(f"Fonksiyon sonrası: {sayilar}")
print("\n⚠️ DİKKAT: Orijinal liste değişti!")

♻️ Recursive (Özyinelemeli) Fonksiyonlar

📌 Recursion Nedir?
Bir fonksiyonun kendi kendini çağırmasına recursion denir.

Faktöriyel Hesaplama

graph TD A["faktoriyel(5)"] --> B["5 × faktoriyel(4)"] B --> C["5 × 4 × faktoriyel(3)"] C --> D["5 × 4 × 3 × faktoriyel(2)"] D --> E["5 × 4 × 3 × 2 × faktoriyel(1)"] E --> F["5 × 4 × 3 × 2 × 1"] F --> G["120"] style A fill:#667eea,color:#fff style E fill:#ffc107,color:#333 style G fill:#28a745,color:#fff
Python Kodu
def faktoriyel(n):
    """Recursive faktöriyel hesaplama"""
    # Base case
    if n == 0 or n == 1:
        return 1
    
    # Recursive case
    return n * faktoriyel(n - 1)

# Test
print("Faktöriyel hesaplamaları:")
for i in range(1, 8):
    print(f"{i}! = {faktoriyel(i)}")

Fibonacci Serisi

Python Kodu
def fibonacci(n):
    """
    N. Fibonacci sayısını hesaplar
    Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, ...
    """
    # Base cases
    if n == 0:
        return 0
    if n == 1:
        return 1
    
    # Recursive case
    return fibonacci(n - 1) + fibonacci(n - 2)

# İlk 10 Fibonacci sayısı
print("Fibonacci Serisi:")
for i in range(10):
    print(f"F({i}) = {fibonacci(i)}")

📝 Kendiniz Deneyin!

Aşağıdaki kod alanını düzenleyebilir ve kendi kodlarınızı yazabilirsiniz:

Düzenlenebilir Python Kodu