Fonksiyonlar ve İlk Gerçek Programın
Bu derste ne yapacağız?
Bu kursun son dersinde iki şeyi öğreneceksin: kod tekrarını önleyen fonksiyon kavramını ve şimdiye kadar öğrendiğin her şeyi (değişkenler, girdi/çıktı, koşullar, döngüler, listeler) bir araya getirerek küçük ama gerçekten çalışan bir program yazmayı. Ön koşul olarak önceki derslerde gördüğün değişken tanımlama, input() ile veri alma, if/else koşulları, for döngüleri ve liste kullanımı konularına aşina olman yeterli. Bu dersin sonunda kendi başına bir "not ortalaması hesaplayıcı" programı yazmış olacaksın. Arayüz görüntüleri kullanmıyoruz; bunun yerine kod satırlarını ve düzenleyicinde yapacağın adımları sözle anlatıyoruz, çünkü kod editörünün görünümü kullandığın programa göre küçük farklılıklar gösterebilir.
Kavram
Fonksiyon, belirli bir işi yapmak üzere bir kere yazılıp istediğin kadar çağrılabilen kod parçasıdır. Günlük hayattan bir benzetme yapalım: bir kahve makinesi düşün. Kahve çekirdeği ve su koyup düğmeye bastığında makine her seferinde aynı işlemi (öğütme, demleme, süzme) yapar ve sana kahve verir. Sen makinenin içinde ne olduğunu her seferinde yeniden düşünmezsin; sadece düğmeye basarsın. Fonksiyonlar da tam olarak böyle çalışır: bir işlemi bir kere tanımlarsın, sonra ne zaman o işe ihtiyacın olursa fonksiyonu "çağırırsın" ve kod tekrar tekrar yazılmaz.
Python'da bir fonksiyon def anahtar kelimesiyle tanımlanır. Fonksiyona bir isim verilir, parantez içine varsa parametreler (fonksiyonun dışarıdan alacağı bilgiler) yazılır ve fonksiyonun gövdesi girintili şekilde alt satırlara yazılır. Fonksiyon bir sonucu geri döndürmek istiyorsa return ifadesi kullanılır. return ile biten bir fonksiyon, hesapladığı değeri çağrıldığı yere geri verir; bu değer bir değişkene atanabilir, ekrana yazdırılabilir veya başka bir işlemde kullanılabilir.
Neden fonksiyon kullanırız? Üç temel sebep vardır: kod tekrarını azaltmak, programı okunur ve anlaşılır parçalara bölmek, ve bir hatayı düzeltmek gerektiğinde tek bir yeri değiştirmenin yeterli olmasını sağlamak. Bugüne kadar yazdığın kodlarda aynı hesaplamayı birden fazla yerde yapman gerekseydi, o kodu her seferinde kopyalayıp yapıştırman gerekirdi. Fonksiyon sayesinde o kodu bir kez yazar, istediğin kadar çağırırsın; bu hem zaman kazandırır hem de hataları azaltır çünkü düzeltme yapılacak tek bir yer vardır.
Adım adım uygulama
Şimdi öğrendiğin her şeyi birleştirerek bir "Not Ortalaması Hesaplayıcı" programı yazalım. Programın amacı: kullanıcıdan kaç not gireceğini sormak, notları tek tek almak, ortalamayı hesaplayan bir fonksiyon yazmak, sonucu değerlendiren başka bir fonksiyon yazmak ve sonunda sonucu ekrana yazdırmak.
İzlenecek adımlar sırasıyla şöyledir:
- 1. Python dosyanı aç ve not_ortalamasi.py adıyla kaydettiğin (veya kaydedeceğin) dosyayı düzenleyicinde hazırla.
- 2. Ortalamayı hesaplayan fonksiyonu tanımlamak için şu satırı yaz: def not_ortalamasi_hesapla(notlar):
- 3. Fonksiyonun gövdesine, girinti bırakarak şu satırı ekle: return sum(notlar) / len(notlar). Burada sum() listedeki tüm sayıları toplar, len() ise listedeki eleman sayısını verir; toplamı eleman sayısına bölmek ortalamayı hesaplar.
- 4. Sonucu değerlendirecek ikinci fonksiyonu tanımla: def sonucu_degerlendir(ortalama):
- 5. Bu fonksiyonun içine bir koşul yaz: if ortalama >= 50: satırının altına girintili olarak return "Geçti" yaz, sonra else: satırının altına girintili olarak return "Kaldı" yaz.
- 6. Fonksiyon tanımlarının bittiği yerden itibaren, girintisiz şekilde programın ana akışını yazmaya başla. Önce boş bir liste oluştur: notlar = []
- 7. Kullanıcıdan kaç not gireceğini sor ve gelen metni tam sayıya çevir: sayi = int(input("Kaç adet not gireceksiniz? "))
- 8. Belirtilen sayı kadar not almak için bir döngü kur: for i in range(sayi):
- 9. Döngünün içine, girintili olarak, her seferinde bir not iste ve listeye ekle. Önce not_degeri = float(input("Notu girin: ")) yaz, altına notlar.append(not_degeri) ekle. float() kullanmamızın sebebi notların ondalıklı olabilmesidir (örneğin 67.5).
- 10. Döngü bittikten sonra, girintisiz olarak, az önce tanımladığın fonksiyonu çağır: ortalama = not_ortalamasi_hesapla(notlar)
- 11. Değerlendirme fonksiyonunu çağır: sonuc = sonucu_degerlendir(ortalama)
- 12. Sonuçları ekrana yazdır: önce print("Ortalamanız:", ortalama), altına print("Durum:", sonuc) yaz.
- 13. Dosyayı kaydet ve terminalde python not_ortalamasi.py komutuyla çalıştır (bazı sistemlerde python3 not_ortalamasi.py gerekebilir; terminal penceresini açtığın programın adı ve görünümü işletim sistemine göre değişebilir).
- 14. Program sırayla kaç not gireceğini soracak, sonra her not için ayrı ayrı soru soracak, en sonunda hesapladığı ortalamayı ve geçti/kaldı durumunu ekrana yazacak.
Bu programda dikkat etmen gereken en önemli nokta girinti düzenidir. Python'da girinti (satır başındaki boşluklar) kod bloklarını belirler; bir fonksiyonun içindeki veya bir döngünün içindeki satırlar, o bloğun bir parçası olduğunu göstermek için aynı miktarda girintiyle (genellikle dört boşluk) başlamalıdır. Girinti hatalı olursa Python hata verir ya da kodun mantığı bozulur.
İstersen fonksiyonu farklı listelerle tekrar tekrar çağırarak test edebilirsin; örneğin doğrudan not_ortalamasi_hesapla([80, 90, 70]) yazarak fonksiyonu bağımsız şekilde deneyebilirsin. Bu, fonksiyonun tekrar kullanılabilir ve bağımsız olduğunu gösterir; aynı fonksiyonu istediğin kadar farklı veriyle çağırabilirsin.
Sık karşılaşılan sorunlar
| Hata / Durum | Çözüm |
|---|---|
| IndentationError: expected an indented block | def, for veya if satırından sonraki satır girintilenmemiş demektir; o satırın başına boşluk (genellikle dört boşluk) ekle. |
| TypeError: unsupported operand type(s) | input() ile alınan değer metin (str) olarak kalmış, sayıya çevrilmemiştir; float() veya int() ile dönüştürmeyi unutma. |
| ZeroDivisionError: division by zero | notlar listesi boşken ortalama hesaplanmaya çalışılmıştır; kullanıcının en az bir not girmesini sağla veya listenin boş olup olmadığını kontrol et. |
| NameError: name 'ortalama' is not defined | fonksiyon çağrılmadan sonucu kullanılmaya çalışılmıştır; önce fonksiyonu çağırıp sonucu bir değişkene ata, sonra o değişkeni kullan. |
| Fonksiyon çalışıyor ama sonuç hiçbir yerde görünmüyor | fonksiyon içinde return yerine yanlışlıkla print kullanılmış olabilir; return değeri programın geri kalanına geri döndürür, print ise sadece ekrana yazar, ikisi farklı amaçlar taşır ve birbirinin yerine geçmez. |
Mini görev
Az önce yazdığın not ortalaması programını kendi başına geliştir. Aşağıdaki eklemeleri sırayla dene:
- En yüksek notu bulan ayrı bir fonksiyon yaz; içinde Python'ın hazır max() fonksiyonunu kullanabilirsin.
- En düşük notu bulan ayrı bir fonksiyon yaz; bunun için min() fonksiyonunu kullanabilirsin.
- Ortalama 85 ve üzerindeyse ekrana ek olarak "Teşekkür Belgesi" mesajı yazdıran bir koşul ekle.
- Programı en az üç farklı not listesiyle (örneğin hepsi düşük, hepsi yüksek, karışık) çalıştırıp sonuçları karşılaştır.
Kontrol listesi:
- Program hiçbir hata vermeden baştan sona çalışıyor mu?
- En az iki fonksiyon tanımladın mı (ortalama hesaplama ve sonucu değerlendirme)?
- Girinti düzenini doğru kurup IndentationError almadan çalıştırabildin mi?
- Programı en az üç farklı veri kümesiyle test edip sonuçların mantıklı olduğunu doğruladın mı?
Kendini sına
1. Python'da bir fonksiyon tanımlamak için hangi anahtar kelime kullanılır?
2. Bir fonksiyonun içindeki return ifadesinin görevi nedir?
3. Aşağıdaki koddaki hata nedir? def kare_al(sayi):\nreturn sayi * sayi (return satırı girintisiz yazılmıştır)
4. sum() ve len() fonksiyonları bir liste üzerinde ne işe yarar?
5. Bir fonksiyonu print ile değil de return ile bitirmek neden daha esnek bir tercihtir?
Cevaplar
1. def anahtar kelimesi kullanılır; ardından fonksiyon adı ve parantez gelir.
2. return, fonksiyonun hesapladığı değeri fonksiyonu çağıran yere geri gönderir; bu değer bir değişkene atanabilir veya başka bir işlemde kullanılabilir.
3. Girinti hatası (IndentationError) vardır; return satırı def satırından sonra girintili olmalıdır, aksi hâlde Python fonksiyonun gövdesinin nerede başladığını anlayamaz.
4. sum() listedeki tüm sayısal değerlerin toplamını verir, len() ise listedeki eleman sayısını verir; ikisi birlikte ortalama hesaplamak için kullanılabilir.
5. return ile biten bir fonksiyon sonucu sadece ekrana yazdırmakla kalmaz, o sonucu bir değişkene atamana, başka bir hesaplamada kullanmana veya farklı bir fonksiyona parametre olarak vermene izin verir; print ise sonucu sadece ekrana basar ve programın geri kalanında kullanılamaz.
Kapanış
Bu dersle birlikte "Python ile Programlamaya Giriş" kursunu tamamlamış oldun. Değişkenlerle veri saklamayı, input() ve print() ile kullanıcıyla iletişim kurmayı, if/else ile karar verdirmeyi, for ve while döngüleriyle işlemleri tekrarlatmayı, listelerle birden fazla veriyi bir arada tutmayı ve son olarak fonksiyonlarla kodunu düzenli, tekrar kullanılabilir parçalara bölmeyi öğrendin. Bu derste yazdığın not ortalaması programı, aslında bütün bu konuların bir araya gelmiş hâliydi; küçük görünse de gerçek bir programın nasıl kurgulandığını gösteriyor. Buradan sonraki adımın, öğrendiklerini pekiştirmek için kendi küçük fikirlerini (örneğin basit bir alışveriş listesi, bir birim çevirici veya bir sayı tahmin oyunu) kodlamaya çalışmak olabilir. Programlamada en çok öğreten şey, bol bol kod yazıp hatalarla karşılaşmak ve onları çözmektir; bu yüzden pratik yapmaya devam et. Emeğin için tebrikler, iyi kodlamalar dileriz.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol