Bir cümlelik özet
Fonksiyon, bir işi yapan kod parçasına bir isim verip o işi istediğimiz zaman tek satırla tekrar tekrar çağırmamızı sağlayan bir yapıdır.
Neden önemli?
Bir program büyüdükçe aynı işi birden çok yerde yapmamız gerekir. Bir dikdörtgenin alanını bir yerde, sonra başka bir yerde, sonra bir daha hesaplarsın. Aynı satırları defalarca yazmak hem yorucudur hem de hataya açıktır: bir yerde düzeltirsin, diğer yerde unutursun.
Fonksiyonlar bu sorunu çözer. Bir işi bir kez yazarız, ona bir isim veririz ve sonra o ismi söyleyerek işi baştan sona tekrar çalıştırırız. Böylece kodumuz kısalır, okunması kolaylaşır ve bir hatayı tek bir yerde düzeltmemiz yeterli olur. Fonksiyonlar, programlamada "kendini tekrar etme" fikrinin en temel aracıdır.
Fonksiyon nedir?
Bir fonksiyonu, bir düğmeye takılmış hazır bir tarif gibi düşünebilirsin. Tarifi bir kez yazarsın; sonra ne zaman istersen düğmeye basar ve tarif çalışır.
Python'da bir fonksiyon def anahtar kelimesiyle tanımlanır. def, "define" yani "tanımla" kelimesinin kısasıdır.
def selam_ver():
print("Merhaba!")
print("Bugün kod yazıyoruz.")
Burada selam_ver fonksiyonun ismidir, () parantezleri fonksiyona ait olduğunu gösterir ve satır sonundaki : işareti bloğun başladığını söyler. İçerideki iki satır 4 boşluk içeride yazılmıştır. Bu içeriye kaydırmaya girinti (indentation) denir ve Python'da zorunludur: girintili satırlar fonksiyonun gövdesidir, yani fonksiyon çalışınca yapılacak işlerdir.
Dikkat: Yukarıdaki kodu çalıştırınca ekrana hiçbir şey yazılmaz. Çünkü fonksiyonu sadece tanımladık, henüz çağırmadık. Bir fonksiyonu çalıştırmak için ismini yazıp parantez açıp kaparız:
def selam_ver():
print("Merhaba!")
print("Bugün kod yazıyoruz.")
selam_ver()
selam_ver()
Bu program iki kez "Merhaba!" ve "Bugün kod yazıyoruz." yazar. Tarifi bir kez yazdık, iki kez çağırdık. İşte fonksiyonun gücü budur.
Parametreler ve return
Yukarıdaki fonksiyon her seferinde aynı işi yapıyor. Ama çoğu zaman fonksiyona bir bilgi verip ona göre çalışmasını isteriz. Fonksiyona dışarıdan verdiğimiz bu bilgilere parametre denir.
Parametre: fonksiyona bilgi vermek
Parametreleri parantezin içine yazarız. Bir dikdörtgenin alanını hesaplayan bir fonksiyon yazalım. Alan = genişlik × yükseklik olduğu için fonksiyona iki bilgi vermeliyiz:
def alan_yaz(genislik, yukseklik):
alan = genislik * yukseklik
print("Alan:", alan)
alan_yaz(5, 3)
alan_yaz(10, 2)
Burada genislik ve yukseklik birer parametredir. alan_yaz(5, 3) diye çağırdığımızda genislik 5, yukseklik 3 olur ve ekrana Alan: 15 yazılır. İkinci çağrıda Alan: 20 yazılır. Aynı fonksiyon, farklı değerlerle farklı sonuçlar üretti.
return: sonucu geri vermek
alan_yaz sonucu ekrana yazıyor ama bize geri vermiyor. Çoğu zaman sonucu ekrana yazmak yerine onu geri döndürüp başka bir işlemde kullanmak isteriz. Bunun için return kullanırız. return, "hesapladığım değeri fonksiyonu çağıran yere geri gönder" demektir.
def alan_hesapla(genislik, yukseklik):
return genislik * yukseklik
birinci = alan_hesapla(5, 3)
ikinci = alan_hesapla(10, 2)
print("Toplam alan:", birinci + ikinci)
Burada alan_hesapla(5, 3) bize 15 değerini geri verir ve biz onu birinci değişkenine koyarız. Aynı şekilde ikinci 20 olur. Sonra bu iki sonucu toplayıp Toplam alan: 35 yazdırırız.
print ile return arasındaki farkı unutma: print bir şeyi sadece ekranda gösterir, return ise değeri programda kullanılmak üzere geri verir. Bir return çalışınca fonksiyon hemen orada biter.
Kodu yeniden kullanmak ve yerel değişkenler
Şimdi bir sayının çift olup olmadığını söyleyen bir fonksiyon yazalım. Bir sayı 2'ye tam bölünüyorsa çifttir. Bunu % 2 == 0 ile kontrol ederiz (% kalanı verir).
Doğru/yanlış döndüren fonksiyon
def cift_mi(sayi):
if sayi % 2 == 0:
return True
else:
return False
print(cift_mi(4))
print(cift_mi(7))
Bu program önce True (doğru), sonra False (yanlış) yazar. cift_mi fonksiyonu bir soruya "evet" ya da "hayır" cevabı verir gibi çalışır. Artık bu fonksiyonu bir listedeki tüm sayılar için tekrar tekrar kullanabiliriz:
sayilar = [3, 8, 11, 20, 15]
for sayi in sayilar:
if cift_mi(sayi):
print(sayi, "çift")
else:
print(sayi, "tek")
Fonksiyonu bir kez yazdık; döngü içinde beş kez çağırdık. Kod hem kısa hem de anlaşılır oldu.
Yerel değişken nedir?
Bir fonksiyonun içinde oluşturduğumuz değişkenler yalnız o fonksiyonun içinde yaşar. Bunlara yerel değişken denir. Fonksiyon bitince bu değişkenler ortadan kalkar ve dışarıdan onlara ulaşamayız.
def alan_hesapla(genislik, yukseklik):
alan = genislik * yukseklik
return alan
print(alan_hesapla(4, 6))
print(alan) # HATA: alan burada tanımlı değil
Buradaki alan değişkeni alan_hesapla fonksiyonunun içinde yaşar. Fonksiyonun dışında print(alan) yazınca Python hata verir, çünkü alan orada tanımlı değildir. Bu aslında iyi bir şeydir: her fonksiyon kendi kutularıyla çalışır, birbirinin değişkenlerini yanlışlıkla bozmaz.
Mini uygulama
Bir öğrencinin girdiği notun geçer mi kalır mı olduğunu söyleyen bir fonksiyon yaz.
gecti_miadında,notparametresi alan bir fonksiyon tanımla.- Not 50 veya daha büyükse
True, değilseFalsedöndür. - Fonksiyonu birkaç farklı notla çağırıp sonucu ekrana yazdır.
Başlangıç için ipucu:
def gecti_mi(notu):
if notu >= 50:
return True
else:
return False
print(gecti_mi(75))
print(gecti_mi(40))
Kendi çözümünü yazdıktan sonra şunu dene: notları bir liste içine koy ve bir döngü ile hepsini tek tek kontrol et.
Uygulama laboratuvarı: Fonksiyonlar
Fonksiyonlar konusunu kalıcı hâle getirmenin en iyi yolu, kavramı küçük ve ölçülebilir bir göreve dönüştürmektir. Bu çalışmada Fonksiyon nedir? ile Parametre: fonksiyona bilgi vermek arasındaki ilişkiyi kullanarak çalışan kısa bir Python 3 programı, örnek girdiler ve beklenen çıktılar hazırlayacaksın. Amaç yalnız sonucun çalışması değil; hangi kararı neden verdiğini, neyi test ettiğini ve hangi durumda tasarımı değiştireceğini açıklayabilmektir.
Görev senaryosu
Şu senaryoyu ele al: bir dosyadaki satırları okuyup basit özet çıkaran araç. Dersin ana hedefi “def ile fonksiyon tanımlamayı, parametre ve return ile kodu yeniden kullanmayı öğren” olduğuna göre önce problemi tek cümleyle tanımla. Ardından sistemin alacağı girdiyi, uygulayacağı işlemi ve üreteceği çıktıyı ayrı ayrı yaz. Bilmediğin bir ayrıntı varsa onu varsayım olarak işaretle; varsayımı gerçek bilgi gibi kullanma.
- Planla: Başlangıç durumunu, beklenen sonucu ve kullanacağın kavramları yaz.
- En küçük sürümü kur: Yalnız temel davranışı çalıştır; süsleme ve ek özellikleri sonraya bırak.
- Üç test hazırla: Normal bir durum, sınırda bir durum ve hatalı ya da beklenmeyen bir durum seç.
- Sonucu kaydet: Beklenen ile gerçekleşeni yan yana yaz; fark varsa olası nedeni belirt.
- Tek değişiklik yap: Aynı anda birçok şeyi değiştirmek yerine bir kararı düzeltip testi yeniden çalıştır.
Başarı ölçütleri
- Kod Python 3 sözdizimiyle çalışıyor mu?
- Değişken ve fonksiyon adları amacı açıklıyor mu?
- Boş, yanlış türde ve sınırdaki girdiler denendi mi?
- Hata mesajı kullanıcıya neyi düzeltmesi gerektiğini söylüyor mu?
- Aynı kod gereksiz tekrar olmadan yeniden kullanılabiliyor mu?
“Fonksiyonlar” çalışmasını bitirdiğinde ürünü bir arkadaşına yalnız bölüm başlıklarıyla anlat. Arkadaşın bir dosyadaki satırları okuyup basit özet çıkaran araç senaryosundaki adımları ve karar nedenlerini takip edebiliyorsa anlatım yeterince açıktır. Anlaşılmayan noktayı daha fazla terim ekleyerek değil, Fonksiyon nedir? ve Parametre: fonksiyona bilgi vermek ilişkisini daha küçük adımlara bölerek düzelt.
Sık yapılan hatalar
Fonksiyonu çağırmayı unutmak
Sadece def ile fonksiyon yazmak onu çalıştırmaz. Fonksiyonun çalışması için ismini yazıp parantez açman gerekir.
def selam_ver():
print("Merhaba!")
selam_ver # yanlış: fonksiyon çalışmaz
selam_ver() # doğru: fonksiyon çalışır
return yerine sadece print kullanmak
Sonucu başka bir yerde kullanacaksan print yeterli değildir; değeri return ile geri vermelisin. print sadece ekrana yazar, geriye bir değer bırakmaz.
Parametre sayısını karıştırmak
Fonksiyon iki parametre bekliyorsa onu iki değerle çağırmalısın. Eksik veya fazla değer verirsen Python hata verir.
def alan_hesapla(genislik, yukseklik):
return genislik * yukseklik
alan_hesapla(5) # HATA: yukseklik verilmedi
Yerel değişkene dışarıdan ulaşmaya çalışmak
Bir fonksiyonun içindeki değişken dışarıda tanımlı değildir. O değeri dışarıda kullanmak istiyorsan return ile geri döndür.
Güvenlik notu
Fonksiyonlar bilgisayarına zarar vermez, ama internette bulduğun her kodu düşünmeden çalıştırmamalısın. Yalnız kendi yazdığın veya öğretmeninin/velinin güvendiği kodları çalıştır. Ayrıca programlarında adın, adresin, okulun gibi kişisel bilgileri koda gömme ve bunları başkalarıyla paylaşma.
Ders özeti
- Fonksiyon, bir işe isim verip onu istediğimiz zaman tekrar çağırmamızı sağlar.
- Fonksiyonlar
defile tanımlanır veisim()yazılarak çağrılır. - Parametreler, fonksiyona dışarıdan verdiğimiz bilgilerdir.
return, fonksiyonun hesapladığı değeri geri verir;printise sadece ekrana yazar.- Fonksiyon içinde oluşturulan yerel değişkenler yalnız o fonksiyonun içinde yaşar.
Kontrol soruları
- Bir fonksiyonu Python'da hangi anahtar kelimeyle tanımlarız?
- Fonksiyonu sadece tanımlamak onu çalıştırmaya yeter mi? Çalıştırmak için ne yapmalıyız?
- Parametre nedir?
printilereturnarasındaki temel fark nedir?- Yerel değişken ne demektir?
Cevaplar
defanahtar kelimesiyle tanımlarız. Örneğindef selam_ver():bir fonksiyon başlatır.- Hayır, yetmez. Tanımlamak tarifi yazmaktır; çalıştırmak için fonksiyonun ismini yazıp parantez açıp kapamamız, yani onu çağırmamız gerekir:
selam_ver(). - Parametre, fonksiyona dışarıdan verdiğimiz bilgidir. Fonksiyon bu bilgiye göre çalışır. Örneğin
alan_hesapla(genislik, yukseklik)fonksiyonundagenislikveyukseklikbirer parametredir. printbir değeri yalnız ekranda gösterir; geriye bir sonuç bırakmaz.returnise değeri fonksiyonu çağıran yere geri verir; böylece o değeri bir değişkene koyabilir veya başka işlemde kullanabiliriz.- Yerel değişken, bir fonksiyonun içinde oluşturulan ve yalnız o fonksiyonun içinde yaşayan değişkendir. Fonksiyon bitince ortadan kalkar ve dışarıdan ona ulaşılamaz.
Kaynak ve doğrulama notu
“Fonksiyonlar” dersi için doğrulama odağı Fonksiyon nedir? ile Parametre: fonksiyona bilgi vermek arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Kod örnekleri Python 3 sözdizimi esas alınarak hazırlanmıştır. Çalıştırma ortamına göre küçük farklar görülebileceği için örnekler önce güvenli bir çevrim içi editörde veya yerel geliştirme ortamında denenmelidir.
Sonraki ders
Hata Mesajlarını Okumak: Python bir hata verdiğinde panik yapmadan mesajı okumayı, hatanın türünü ve satırını bulmayı öğreniyoruz.