Bir cümlelik özet
Bir gün girdiğinde o günün derslerini ve gerekli kitapları listeleyen, sonra çantandaki eksikleri söyleyen küçük bir Python programı yazacağız.
Neden önemli?
Algoritma modülünde "akıllı çanta" fikrini konuşmuştuk: sabah çantanı kontrol etmek için açık adımlar yazmıştık. O zaman bu bir sözde koddu. Şimdi aynı fikri gerçek çalışan bir programa çevireceğiz.
Bu proje, öğrendiğimiz üç aracı bir arada kullanıyor: bilgiyi sözlük ve listede saklamak, kullanıcıdan girdi almak ve koşul ile döngü kurmak. Yani tek bir küçük programda modülün en önemli parçalarını birleştiriyoruz.
Ben bu programı yazarken küçük bir hatayla karşılaştım ve onu nasıl düzelttiğimi de aşağıda paylaşıyorum. Kod ilk denemede çalışmadı; önemli olan hatanın nerede olduğunu bulmaktı.
Ders programını nasıl saklarız?
Bir programda çok sayıda ilişkili bilgi tutmamız gerektiğinde sözlük (İngilizcesi *dictionary*) kullanırız. Sözlük, her bilgiyi bir anahtar ile eşleştirir. Gerçek bir sözlükte kelimeyi bulup karşısındaki anlamı okuruz; Python sözlüğünde de anahtarı verip karşısındaki değeri alırız.
Günleri ve dersleri eşleştirmek
Her günün karşısına o günün derslerini bir liste olarak yazalım. Liste, sıralı birden çok değeri köşeli parantez içinde tutar.
ders_programi = {
"pazartesi": ["matematik", "türkçe", "fen"],
"salı": ["ingilizce", "matematik", "müzik"],
"çarşamba": ["fen", "sosyal", "türkçe"],
}
Burada anahtar bir gün adı, değer ise o günün dersleri. ders_programi["salı"] yazarsak Python bize ["ingilizce", "matematik", "müzik"] listesini verir. Sözlüğün güzelliği şu: bilgiyi sıraya göre değil, anlamına göre buluruz. "Salı günü hangi dersler var?" sorusunun cevabına doğrudan gün adıyla ulaşırız; listenin kaçıncı sırada olduğunu ezberlememize gerek kalmaz.
Her dersin kitabını eşleştirmek
İkinci bir sözlükte her dersin hangi kitaba ihtiyaç duyduğunu tutalım.
kitaplar = {
"matematik": "Matematik kitabı",
"türkçe": "Türkçe kitabı",
"fen": "Fen kitabı",
"ingilizce": "İngilizce kitabı",
"müzik": "Müzik kitabı",
"sosyal": "Sosyal Bilgiler kitabı",
}
Artık kitaplar["fen"] bize "Fen kitabı" değerini verir. İki sözlüğü birleştirince, bir günün derslerinden gerekli kitapların listesine ulaşabiliriz.
Kullanıcıdan gün alıp dersleri göstermek
Programın kullanıcıyla konuşan kısmına geçelim. Kullanıcıdan bir gün alacağız, o günü sözlükte arayacağız ve dersleri tek tek yazdıracağız.
Girdiyi güvenli hale getirmek
Kullanıcı "Pazartesi", "pazartesi" veya boşluklu " pazartesi" yazabilir. Bunların hepsini aynı kabul etmek için girdiyi küçük harfe çevirip baştaki-sondaki boşlukları temizleriz.
gun = input("Hangi günü kontrol edelim? ").lower().strip()
lower() tüm harfleri küçültür, strip() kenardaki boşlukları siler. Böylece kullanıcının nasıl yazdığından bağımsız aynı sonucu alırız.
Dersleri döngü ile yazdırmak
Şimdi o günün dersleri arasında dolaşacağız. Aynı işi her ders için tekrarladığımız için for döngüsü kullanırız. Python'da döngünün içindeki satırlar 4 boşluk girinti ile yazılır; girinti, o satırların döngüye ait olduğunu gösterir.
if gun in ders_programi:
dersler = ders_programi[gun]
print(gun.capitalize(), "günü dersleri:")
for ders in dersler:
print("-", ders, "->", kitaplar[ders])
else:
print("Bu gün için ders programı bulunamadı.")
if gun in ders_programi satırı, girilen günün sözlükte olup olmadığını kontrol eder. Varsa dersleri listeleriz; yoksa kibar bir uyarı veririz. in anahtar kelimesi bu kontrolü çok kolaylaştırır.
Eksik kitap kontrolü
Projenin asıl amacı buydu: o gün gerekli kitaplardan hangileri çantada değil? Bunun için çantada bulunan kitapları bir listede tutalım, sonra her gerekli kitabı bu listede arayalım.
cantadaki_kitaplar = ["Matematik kitabı", "Fen kitabı"]
eksik_var = False
for ders in dersler:
gerekli = kitaplar[ders]
if gerekli not in cantadaki_kitaplar:
print("EKSİK:", gerekli)
eksik_var = True
if not eksik_var:
print("Harika! Bütün kitaplar çantanda.")
not in ifadesi, "bu değer listede yok mu?" sorusunu sorar. eksik_var adında bir işaret değişkeni tutarız: döngü boyunca hiçbir eksik bulunmazsa değeri False kalır ve sonunda güzel bir mesaj basarız.
Tam programı birleştirmek
İki sözlüğü, girdiyi, döngüyü ve eksik kontrolünü tek dosyada topladığımızda program tamamlanır.
gun = input("Hangi günü kontrol edelim? ").lower().strip()
if gun in ders_programi:
dersler = ders_programi[gun]
print(gun.capitalize(), "günü dersleri:")
for ders in dersler:
print("-", ders, "->", kitaplar[ders])
for ders in dersler:
if kitaplar[ders] not in cantadaki_kitaplar:
print("EKSİK:", kitaplar[ders])
else:
print("Bu gün için ders programı bulunamadı.")
Programı test etmek
Kullanıcı pazartesi girerse ekranda şunu görürüz:
Pazartesi günü dersleri:
- matematik -> Matematik kitabı
- türkçe -> Türkçe kitabı
- fen -> Fen kitabı
EKSİK: Türkçe kitabı
Matematik ve Fen kitabı çantada olduğu için yalnız Türkçe kitabı eksik göründü. Program tam istediğimiz gibi çalışıyor. Farklı günler girip test etmek iyi bir alışkanlıktır: çarşamba girersen dersler ve eksik kitaplar değişir, cumartesi gibi tanımsız bir gün girersen "bulunamadı" mesajını görürsün. Her yeni girdi, kodun farklı bir yolunu denememizi sağlar.
Mini uygulama
Programı kendi haline getirmen için üç görev:
perşembevecumagünlerini derslerini deders_programisözlüğüne ekle. Yeni geçen dersler içinkitaplarsözlüğüne de kitap ekle.- Program sonunda toplam kaç kitap eksik olduğunu yazdır. İpucu: bir
sayac = 0değişkeni tut ve her eksiktesayac = sayac + 1yap. - Kullanıcı sözlükte olmayan bir gün girerse, hangi günlerin tanımlı olduğunu ekrana yazdır. İpucu:
for gun in ders_programi:ile anahtarları dolaşabilirsin.
Projeyi güçlendirme planı
Proje: Ders Programı Kontrolü için yalnız çalışan bir gösterim hazırlamak yeterli değildir. İyi bir proje; hedefi, kullanıcıyı, sınırları, test koşullarını ve başarısız denemeleri de görünür kılar. Bu genişletme çalışmasında bir dosyadaki satırları okuyup basit özet çıkaran araç bağlamını kullanarak çalışan kısa bir Python 3 programı, örnek girdiler ve beklenen çıktılar oluştur. Dersin hedefi “Sözlük ve listelerle ders programını tutup güne göre dersleri ve kitapları listeleyen bir program yaz” olsa da proje sayfasında ölçülmemiş bir sonucu kesin başarı gibi yazma.
1. Proje özeti ve kapsam
Önce üç cümle yaz: Çözmek istediğin sorun nedir, bu sorun kimin için önemlidir ve ilk sürüm özellikle neyi yapmayacaktır? Kapsam dışını belirtmek projeyi küçültmez; tamamlanabilir hâle getirir. Ders programını nasıl saklarız? ile Her dersin kitabını eşleştirmek arasındaki ilişkiyi projenin temel varsayımı olarak yaz ve bu varsayımı hangi testin doğrulayacağını belirt.
2. Kabul ö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?
“Proje: Ders Programı Kontrolü” için kabul ölçütlerini “çalışıyor” gibi belirsiz sözcüklerle bırakma. Süre, mesafe, doğru deneme sayısı, ekran genişliği veya kullanıcı adımı gibi gözlenebilir bir ölçü seç. Ölçüm mümkün değilse en azından üç ardışık denemede aynı davranışın görülüp görülmediğini kaydet.
3. Test matrisi
| Test | Koşul | Beklenen | Gerçek sonuç | Sonraki karar |
|---|---|---|---|---|
| Normal | Standart giriş ve tam bağlantı | Temel görev tamamlanır | Test sırasında doldur | Koru veya küçük iyileştirme yap |
| Sınır | En düşük ya da en yüksek kabul edilen değer | Sistem kararlı kalır | Test sırasında doldur | Eşiği veya kuralı gözden geçir |
| Hata | Eksik, yanlış ya da beklenmeyen giriş | Güvenli ve anlaşılır tepki | Test sırasında doldur | Hata yönetimi ekle |
| Tekrar | Aynı koşulda en az üç deneme | Benzer sonuçlar | Test sırasında doldur | Tutarsızlığın kaynağını araştır |
4. Sürüm günlüğü
“Proje: Ders Programı Kontrolü” projesinin her sürümü için tarih, değiştirdiğin tek ana karar, değişikliğin nedeni ve test sonucu yaz. İlk sürümün çalışmaması başarısızlık değildir; Ders programını nasıl saklarız? veya Her dersin kitabını eşleştirmek ile ilgili hangi varsayımın yeniden düşünülmesi gerektiğini gösteren veridir. Görsel kullanırken kişisel bilgi ve özel arka plan ayrıntılarını paylaşma.
5. Sunum ve öz değerlendirme
“Proje: Ders Programı Kontrolü” projesini iki dakikada anlatacak şekilde hazırlan: sorun, çözüm yaklaşımı, bir dosyadaki satırları okuyup basit özet çıkaran araç için en önemli test sonucu ve bir sonraki adım. “Tamamlandı” demek yerine hangi kısmın doğrulandığını ve hangi kısmın hâlâ geliştirilmesi gerektiğini açıkla.
Sık yapılan hatalar
Büyük/küçük harf tuzağı
İlk denememde .lower() yazmayı unutmuştum. Kullanıcı Pazartesi yazdığında program "ders programı bulunamadı" dedi, çünkü sözlükteki anahtar küçük harfli pazartesi idi. Beklenen sonuç ile gerçek sonuç farklıydı; sorunu bulunca girdiye .lower() ekledim ve düzeldi.
Sözlükte olmayan anahtarı istemek
ders_programi["cumartesi"] yazarsan ve o anahtar yoksa Python KeyError hatası verir ve program durur. Bu yüzden anahtarı doğrudan almadan önce if gun in ders_programi ile kontrol etmek güvenlidir.
Girinti hatası
Döngü veya if içindeki satırları 4 boşluk girmezsen Python IndentationError verir. Bir bloğun tüm satırları aynı hizada olmalıdır.
Güvenlik notu
Bu program tamamen kendi bilgisayarında çalışan, kendi yazdığın güvenli bir koddur. Yalnız kendine ait, güvendiğin kodları çalıştır. Programa gerçek ad, adres, telefon gibi kişisel bilgilerini yazma; ders adları ve kitaplar bu proje için yeterlidir.
Ders özeti
- Sözlük, her bilgiyi bir anahtarla eşleştirerek ilişkili verileri düzenli tutar.
- Bir günün derslerini liste olarak, her dersin kitabını ayrı bir sözlükte sakladık.
input().lower().strip()ile kullanıcı girdisini nasıl yazıldığından bağımsız hale getirdik.if ... in,fordöngüsü venot inile dersleri listeleyip eksik kitapları bulduk.- Küçük hataları (büyük/küçük harf,
KeyError, girinti) test ederek bulup düzelttik.
Kontrol soruları
- Sözlükte anahtar ne işe yarar?
ders_programi["salı"]ifadesi bize ne döndürür?.lower()ve.strip()girdiye ne yapar?if gun in ders_programikontrolünü kaldırırsak, olmayan bir gün girilince ne olur?- Eksik kitap kontrolünde
not inifadesi hangi soruyu sorar?
Cevaplar
- Anahtar, karşısındaki değere ulaşmamızı sağlar; sözlükte kelimeyi bulup anlamını okumak gibidir.
salıgününün ders listesini, yani["ingilizce", "matematik", "müzik"]döndürür..lower()harfleri küçültür,.strip()baştaki ve sondaki boşlukları siler; böylece"Pazartesi"ve" pazartesi "aynı kabul edilir.- Program
KeyErrorhatası verir ve durur, çünkü olmayan bir anahtarı almaya çalışırız. - "Bu gerekli kitap çantadaki kitaplar listesinde yok mu?" sorusunu sorar; yoksa o kitap eksiktir.
Ek doğrulama görevi
“Proje: Ders Programı Kontrolü” için ikinci bir örnek oluştur: bir dosyadaki satırları okuyup basit özet çıkaran araç. İlk çözümü aynen kopyalamak yerine Ders programını nasıl saklarız? kavramının hangi bölümde, Her dersin kitabını eşleştirmek kavramının hangi kararda kullanıldığını işaretle. Sonucu değerlendirmek için şu iki soruya yazılı cevap ver: “Beklediğim davranış neydi?” ve “Gerçekte hangi kanıtı gördüm?”
Ardından kontrol listesinden özellikle “Kod Python 3 sözdizimiyle çalışıyor mu?” ve “Aynı kod gereksiz tekrar olmadan yeniden kullanılabiliyor mu?” maddelerini kullan. İlk denemede fark bulamazsan bir sınır koşulu ekle; örneğin en küçük değer, en büyük değer, boş giriş, bağlantı kaybı veya yeniden başlatma durumu. Son notunda yaptığın tek değişikliği ve bu değişikliğin sonucu nasıl etkilediğini açıkla.
Kaynak ve doğrulama notu
“Proje: Ders Programı Kontrolü” dersi için doğrulama odağı Ders programını nasıl saklarız? ile Her dersin kitabını eşleştirmek 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
Proje: Basit Spor İstatistikleri