Şimdiye kadar yazdığımız kodlar yukarıdan aşağıya akan tek parça metinlerdi. Aynı işi üç farklı yerde yapman gerekince aynı satırları üç kez kopyaladın. Bu derste o kopyalamayı bitiriyoruz: bir işi bir kez tanımlayıp istediğin kadar kullanmanı sağlayan fonksiyonları öğreneceğiz.
Bence fonksiyonları anlamanın en kolay yolu, okulda matematikte gördüğümüz fonksiyonlarla bağlantı kurmak. Bir fabrika gibi düşün: makineye meyve verirsin, makine sana meyve suyu verir. Python’daki fonksiyonlar da tam olarak böyle çalışıyor.
Bu dersin tüm kodları Colab’da hazır: Colab’da Aç
Aynı kodu üç kez yazmak
Üç öğrencinin not ortalamasını hesaplayalım:
ayse = [80, 70, 90]mert = [45, 60, 51]zeynep = [90, 88, 95]print("Ayşe:", sum(ayse) / len(ayse))print("Mert:", sum(mert) / len(mert))print("Zeynep:", sum(zeynep) / len(zeynep))# Ayşe: 80.0# Mert: 52.0# Zeynep: 91.0
Çalışıyor. Ama ortalama hesabını değiştirmek istersen (mesela en düşük notu atmak) üç satırı da tek tek düzeltmen gerekecek. Otuz öğrencin olsa otuz satır. Fonksiyon tam bu sorunu çözüyor.
İlk fonksiyonun: def
Fonksiyon, bir isim verdiğin kod bloğu. def ile tanımlanıyor:
def selamla(): print("Merhaba!") print("Python Dersi 9'a hoş geldin.")selamla()selamla()
Parçalarına bakalım:
def: “bir fonksiyon tanımlıyorum” demek.selamla: fonksiyonun adı. Değişken adlarındaki kurallar burada da geçerli.(): parantezler. Birazdan içine bir şeyler koyacağız.:ve girinti:ifvefor‘da olduğu gibi, girintili satırlar fonksiyonun gövdesi.
Tanımlamak, çalıştırmak demek değil. def satırı Python’a sadece tarifi öğretir; tarif ancak selamla() diye çağırdığında çalışır. Bu örnekte iki kez çağırdığımız için mesaj iki kez yazılıyor.
Parametre: fonksiyona bilgi vermek
Her seferinde aynı mesajı yazan bir fonksiyon pek işe yaramaz. Parantezlerin içine bir parametre koyarsan fonksiyon her çağrıda farklı bir değerle çalışır:
def selamla(isim): print(f"Merhaba {isim}!")selamla("Ayşe") # Merhaba Ayşe!selamla("Mert") # Merhaba Mert!
isim, fonksiyonun içinde kullanılan bir değişken. Çağırırken parantezin içine yazdığın değer ("Ayşe") o değişkene yerleşiyor. Çağırırken verdiğin bu değere argüman deniyor.
return: fonksiyondan sonuç almak
Asıl güç burada. return, fonksiyonun hesapladığı değeri çağırdığın yere geri gönderir:
def ortalama(notlar): return sum(notlar) / len(notlar)print(ortalama(ayse)) # 80.0mert_ort = ortalama(mert)print(mert_ort + 5) # 57.0
Artık ortalama hesabı tek bir yerde. Hesabı değiştirmek istersen sadece fonksiyonun içini düzeltiyorsun, her çağrı otomatik olarak yeni hesabı kullanıyor.
print ile return aynı şey değil
Yeni başlayanların en sık karıştırdığı konu bu. Şu fonksiyona bak:
def yazdir_ortalama(notlar): print(sum(notlar) / len(notlar))sonuc = yazdir_ortalama(mert) # ekrana 52.0 yazarprint(sonuc) # None
print sonucu sadece ekrana yazar; değer kaybolur. return ise değeri sana verir, sen de onu bir değişkene koyabilir, başka bir hesapta kullanabilirsin. return yazmayan bir fonksiyon None döndürür, yani “hiçbir şey”. Kural basit: sonucu kullanacaksan return, sadece göstereceksen print.
Varsayılan değer ve isimli argüman
Bir parametreye varsayılan değer verebilirsin. Çağırırken o argümanı yazmazsan varsayılan kullanılır:
def gecti_mi(puan, sinir=50): return puan >= sinirprint(gecti_mi(55)) # True (sınır 50)print(gecti_mi(55, 60)) # False (sınır 60)print(gecti_mi(sinir=40, puan=45)) # True
Son satırdaki gibi argümanları adlarıyla da verebilirsin. O zaman sıranın bir önemi kalmaz ve kodu okuyan kişi hangi sayının ne olduğunu hemen anlar.
Birden fazla sonuç döndürmek
Bir fonksiyon aynı anda birkaç değer döndürebilir. Python bunları bir demet (tuple) içinde gönderir; Ders 8’de öğrendiğimiz paket açmayla da tek tek değişkenlere dağıtabilirsin:
def istatistik(notlar): return min(notlar), max(notlar), sum(notlar) / len(notlar)en_dusuk, en_yuksek, ort = istatistik(zeynep)print(en_dusuk, en_yuksek, ort) # 88 95 91.0print(istatistik(mert)) # (45, 60, 52.0)
Kapsam: fonksiyonun içi ve dışı
Fonksiyonun içinde oluşturduğun değişkenler sadece içeride yaşar. Fonksiyon bitince silinir:
def hesapla(): ara_toplam = 10 + 20 return ara_toplamprint(hesapla()) # 30print(ara_toplam) # NameError: name 'ara_toplam' is not defined
Bu bir hata değil, bir güvenlik önlemi. Her fonksiyonun kendi küçük çalışma alanı var; içeride kullandığın i, toplam gibi isimler dışarıdaki aynı isimli değişkenleri bozmuyor. Bir değeri dışarı çıkarmak istiyorsan yolu return.
Docstring: fonksiyona açıklama yazmak
Fonksiyonun ilk satırına üç tırnak arasında bir açıklama yazabilirsin. Buna docstring deniyor ve help() ile okunabiliyor:
def harf_notu(puan): """Puanı harf notuna çevirir: 85+ AA, 70+ BA, 50+ CC, altı FF.""" if puan >= 85: return "AA" elif puan >= 70: return "BA" elif puan >= 50: return "CC" return "FF"print(harf_notu(92), harf_notu(73), harf_notu(50), harf_notu(30))# AA BA CC FFhelp(harf_notu)
Bir detaya dikkat: return çalıştığı anda fonksiyon biter. Bu yüzden son satırdaki return "FF" için else yazmaya gerek yok; oraya ancak yukarıdaki koşulların hiçbiri tutmazsa gelinir.
Mini program: sınıf defteri, fonksiyonlarla
Ders 8’deki sınıf defterini hatırla. Şimdi aynı işi yazdığımız fonksiyonları birleştirerek yapıyoruz:
def rapor(sinif): """Her öğrencinin ortalamasını, harf notunu ve durumunu yazdırır.""" for isim, notlar in sinif.items(): ort = ortalama(notlar) durum = "Geçti" if gecti_mi(ort) else "Kaldı" print(f"{isim:<8} {ort:5.1f} {harf_notu(ort)} {durum}")sinif = {"Ayşe": ayse, "Mert": mert, "Zeynep": zeynep, "Can": [30, 55, 41]}rapor(sinif)
Çıktı:
Ayşe 80.0 BA GeçtiMert 52.0 CC GeçtiZeynep 91.0 AA GeçtiCan 42.0 FF Kaldı
rapor fonksiyonunu oku: neredeyse bir Türkçe cümle gibi. “Her öğrenci için ortalamayı al, geçti mi bak, harf notunu yaz.” Fonksiyonların asıl faydası bu: büyük bir problemi isimleri olan küçük parçalara bölüyorsun, sonra o parçaları birleştiriyorsun.
f"{isim:<8}" ve {ort:5.1f} ifadeleri çıktıyı hizalamak için. İsmi 8 karakterlik alana sola yaslıyor, ortalamayı 5 karakterlik alanda tek ondalıkla yazıyor.
Alıştırmalar
- Bir sayının karesini döndüren
kare(x)fonksiyonu yaz vekare(7)sonucunu yazdır. - Celsius’u Fahrenheit’a çeviren
fahrenheit(c)fonksiyonu yaz (formül:c * 9 / 5 + 32). 0, 25 ve 100 için dene. - Bir listedeki çift sayıların sayısını döndüren
cift_say(liste)fonksiyonu yaz. indirim(fiyat, oran=10)fonksiyonu yaz: indirimli fiyatı döndürsün.indirim(200)veindirim(200, 25)sonuçlarını yazdır.
Cevaplar Colab not defterinin sonunda.
Bu derste ne öğrendik?
deffonksiyonu tanımlar; fonksiyon ancak adıyla çağrılınca çalışır.- Parametreler fonksiyona bilgi taşır; varsayılan değer verilebilir, argümanlar adlarıyla yazılabilir.
returnsonucu geri verir;printsadece ekrana yazar.- Fonksiyonun içindeki değişkenler dışarıdan görünmez.
- Büyük bir programı küçük, isimli fonksiyonlara bölmek kodu okunur yapar.
Sıradaki ders
Python Dersi 10’da şimdiye kadar öğrendiğimiz her şeyi ilk mini projede birleştiriyoruz: Sayı Tahmin Oyunu.

Bir yanıt yazın