Fonksiyonlar (Python Dersi 9)

Ş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: if ve for‘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.0
mert_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 yazar
print(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 >= sinir
print(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.0
print(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_toplam
print(hesapla()) # 30
print(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 FF
help(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çti
Mert 52.0 CC Geçti
Zeynep 91.0 AA Geçti
Can 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

  1. Bir sayının karesini döndüren kare(x) fonksiyonu yaz ve kare(7) sonucunu yazdır.
  2. Celsius’u Fahrenheit’a çeviren fahrenheit(c) fonksiyonu yaz (formül: c * 9 / 5 + 32). 0, 25 ve 100 için dene.
  3. Bir listedeki çift sayıların sayısını döndüren cift_say(liste) fonksiyonu yaz.
  4. indirim(fiyat, oran=10) fonksiyonu yaz: indirimli fiyatı döndürsün. indirim(200) ve indirim(200, 25) sonuçlarını yazdır.

Cevaplar Colab not defterinin sonunda.

Bu derste ne öğrendik?

  • def fonksiyonu 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.
  • return sonucu geri verir; print sadece 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.


Hatice Özbolat | Teknoloji ve AI Rehberi sitesinden daha fazla şey keşfedin

Son gönderilerin e-postanıza gönderilmesi için abone olun.

Comments

“Fonksiyonlar (Python Dersi 9)” için bir yanıt

Bir yanıt yazın