Koşullar ve girdi doğrulama
Geçen hafta bir karşılaştırmanın sonucunun True ya da False olduğunu gördük. Şimdi bu sonuca bakarak programın hangi kodu çalıştıracağını seçeceğiz.
Program her seferinde aynı adımları izlemek zorunda değildir. Öğrencinin notu geçme sınırının üzerindeyse bir mesaj, altındaysa başka bir mesaj yazdırılabilir. Kullanıcı geçersiz bir değer girdiyse program hesaba devam etmek yerine uyarı verebilir. Bu kararları koşullarla veririz.
Bu bölümün kapsamı
if/elseakışını izleme- Bağımsız
ifblokları ileif–elifzincirinin farkı elifsıralamasının sonucu belirlemesi ve erişilemez blok- Sınır değerinde
>ile>=farkı and,orvenotile bileşik koşul kurma- Girdiyi kullanmadan önce kabul aralığını doğrulama
booldeğeri doğrudan koşul olarak kullanma
- Karar tablosunun biçimsel çizim kuralları
- Üç ve daha fazla katmanlı iç içe koşul yapıları
Bu başlıklar konunun devamıdır; ileride karşınıza çıkar ama bu derste ezberlemeniz beklenmiyor.
Aynı puan neden iki programda farklı sonuç verir?
İki program neredeyse aynı görünebilir. Birinde puan > 60, ötekinde puan >= 60 yazıyorsa 60 alan öğrenci birinde kalır, ötekinde geçer. Bazen de fark koşulların sırasındadır. Bu bölümün sonunda bir programın hangi değerde hangi satırları çalıştıracağını kodu çalıştırmadan söyleyebileceksiniz.
if: koşul doğruysa çalıştır
En basit karar if ile yazılır:
puan = 75
if puan >= 60:
print("Geçti")Python önce puan >= 60 ifadesini değerlendirir. Sonuç True ise girintili satır çalışır. Sonuç False ise bu satır atlanır.
Yazarken üç şeye dikkat edin:
- Koşul
ifanahtar sözcüğünden sonra gelir. - Koşul satırı
:ile biter. - Koşula bağlı kod içeri doğru girintilenir.
if koşul:
koşul doğruysa çalışacak kod
Python’da girinti süs değildir: hangi satırın koşula bağlı olduğunu girinti belirler. Aynı bloktaki satırlar aynı düzeyde girintilenmelidir.
Tahmin et: hangi satırlar çalışır?
Aşağıdaki kodu çalıştırmadan önce çıktıyı tahmin edin:
if bloğundan önceki ve sonraki print() çağrıları koşula bağlı değildir. Bu yüzden koşulun sonucu ne olursa olsun çalışırlar.
Şimdi sicaklik değerinin 15 olduğunu düşünün. Kaç satır çıktı kalır?
if–else: iki olasılıktan biri
İki olasılıktan biri mutlaka gerçekleşiyorsa (bakiye ya yeter ya yetmez) else kullanırız:
bakiye = 120
tutar = 150
if bakiye >= tutar:
print("Ödeme yapılabilir")
else:
print("Yetersiz bakiye")Bu yapıda iki bloktan yalnızca biri çalışır.
Alıştırma: sınırdaki değeri düşünün
Bir dersten geçme sınırı 60 olsun. Aşağıdaki program puan = 60 için ne yazdırmalı?
Programı, 60 puan alan öğrenci de geçecek biçimde düzeltin.
>= “büyük veya eşit” anlamına gelir.
puan = 60
if puan >= 60:
print("Geçti")
else:
print("Kaldı")Sınır değerleri neden önemlidir?
Koşulun sonucu belli bir değerde False’tan True’ya döner. Denerken en çok bu değerin çevresine bakmak gerekir. Geçme sınırı 60 ise programı 80 ve 30 ile denemek > ile >= arasındaki farkı göstermez.
En az şu üç değeri deneyin:
| Puan | Beklenen |
|---|---|
59 |
Kaldı |
60 |
Geçti |
61 |
Geçti |
60 burada bir sınır değeridir. puan > 60 ile puan >= 60 yalnızca bu değerde farklı sonuç verir.
Bir koşul yazdıktan sonra kendinize sorun: “Sınırın bir altında, sınırın kendisinde ve bir üstünde ne olur?”
elif: birden fazla seçenek
İkiden fazla durum olduğunda elif kullanılabilir:
puan = 82
if puan >= 90:
print("AA")
elif puan >= 80:
print("BA")
elif puan >= 70:
print("BB")
else:
print("Daha düşük")Python koşullara yukarıdan aşağı bakar. İlk True olan koşulun bloğunu çalıştırır ve zincirin geri kalanını atlar.
Bağımsız if bloklarından birden fazlası çalışabilir
Sık yapılan bir hata, tek bir harf notu seçilecekken her notu ayrı bir if ile yazmaktır:
puan = 95
if puan >= 90:
print("AA")
if puan >= 80:
print("BA")Burada iki if bağımsızdır: Python ikisinin koşuluna da ayrı ayrı bakar. 95 iki koşulu da sağladığı için iki satır yazdırılır:
AA
BA
Her öğrenciye tek bir harf notu vermek istiyorsak elif ile bir zincir kurarız:
puan = 95
if puan >= 90:
print("AA")
elif puan >= 80:
print("BA")Bu kez ilk doğru dal çalıştıktan sonra zincirin geri kalanı atlanır ve yalnızca AA yazdırılır.
Bağımsız if her zaman yanlış değildir. Aynı öğrenci için birbirinden ayrı şeylere bakıyorsanız (devamsızlık sınırını aştı mı, ödevini teslim etti mi) her biri için ayrı if yazmak doğrudur. Yanlış olan, yalnızca biri seçilmesi gereken seçenekleri (harf notları gibi) ayrı if bloklarıyla yazmaktır.
elif zincirinde koşulların sırası da sonucu değiştirir. Aşağıdaki kod 95 puanı yanlış gruba koyar:
puan = 95
if puan >= 70:
print("BB veya üzeri")
elif puan >= 90:
print("AA")95 >= 70 zaten True olduğu için ikinci koşula hiç sıra gelmez.
İncele ve düzelt: koşul sırası
Aşağıdaki program sıcaklığa göre bir etiket yazdırıyor. 32 derece için "Sıcak" yazmalı, ama koşulların sırası yüzünden yazmıyor.
Koşulları, 30 ve üzeri "Sıcak", 20–29 arası "Ilık", daha düşük değerler "Serin" olacak biçimde düzenleyin.
Önce en yüksek eşiği kontrol edin.
sicaklik = 32
if sicaklik >= 30:
print("Sıcak")
elif sicaklik >= 20:
print("Ilık")
else:
print("Serin")Bileşik koşullar
Bazen bir karar için iki karşılaştırma gerekir. Örneğin bir sınav puanı ancak hem 0 ya da daha büyük hem de 100 ya da daha küçükse geçerlidir:
puan = 85
gecerli_mi = puan >= 0 and puan <= 100
print(gecerli_mi)Python’da aynı aralık kontrolü daha kısa da yazılabilir:
gecerli_mi = 0 <= puan <= 100İki yazımın anlamı aynıdır.
or ise koşullardan birinin doğru olması yettiğinde kullanılır:
gun = "Cumartesi"
if gun == "Cumartesi" or gun == "Pazar":
print("Hafta sonu")not, True değeri False, False değeri True yapar:
bakim_var = False
if not bakim_var:
print("Sistem kullanılabilir")bool değeri doğrudan koşulda kullanın
Bir değişken zaten True veya False tutuyorsa onu yeniden True ile karşılaştırmaya gerek yoktur:
uye_mi = True
if uye_mi:
print("Üye indirimi uygulanabilir")Şu yazım çalışsa da gereksizdir:
if uye_mi == True:
print("Üye indirimi uygulanabilir")Değerin False olduğu durumu yakalamak için de == False yerine not yazmak daha kolay okunur:
if not uye_mi:
print("Standart ücret uygulanır")İç içe if: ikinci karar yalnızca ilkinden sonra anlamlıysa
Bazen ikinci koşula ancak ilk koşul doğruysa bakmak isteriz. Örneğin sisteme giriş yapmamış bir kullanıcının rolüne (yönetici mi, standart kullanıcı mı) bakmanın anlamı yoktur:
giris_yapti = True
rol = "yonetici"
if giris_yapti:
if rol == "yonetici":
print("Yönetim ekranı")
else:
print("Standart kullanıcı ekranı")
else:
print("Önce giriş yapmalısınız")Burada içteki if, yalnızca giris_yapti doğru olduğunda çalışır.
İki koşul birlikte tek bir sonucu belirliyorsa and ile yazmak daha açık olabilir:
if giris_yapti and rol == "yonetici":
print("Yönetim ekranı")Başlangıç için şu kural yeter:
- İki koşul aynı sonucu birlikte belirliyorsa çoğu zaman
anddaha kısadır. - İkinci karar yalnızca birinci karar doğruyken anlamlıysa ya da her durum için ayrı bir mesaj gerekiyorsa iç içe
ifdaha açık olabilir.
İç içe if katmanlarını gereksiz yere artırmayın. Aynı karar okunaklı tek bir bileşik koşulla yazılabiliyorsa sade olanı seçin.
Önce doğrula, sonra işlem yap
Kullanıcı her zaman geçerli bir değer girmez. Sınav puanı 0 ile 100 arasında olmalıdır, ama biri yanlışlıkla 120 yazabilir. Program bu değeri kullanmadan önce kontrol etmelidir:
puan = 120
if 0 <= puan <= 100:
print("Geçerli puan")
else:
print("Puan 0 ile 100 arasında olmalı")Bu hafta input() ile alınan metnin sayıya çevrilebildiğini varsayıyoruz. "abc" gibi bir metin int() ile çevrilirken hata verir; bu hatayı henüz ele almıyoruz. Şimdilik yalnız sayı olan ama aralığın dışında kalan değerleri yakalıyoruz.
Alıştırma: yaş aralığını doğrulayın
Bir kayıt formunda yaşın 16 ile 120 arasında olması gerektiğini varsayalım.
if True: satırını uygun aralık koşuluyla değiştirin.
16 <= yas <= 120 biçimindeki zincirli karşılaştırmayı kullanabilirsiniz.
yas = 14
if 16 <= yas <= 120:
print("Geçerli yaş")
else:
print("Yaş 16 ile 120 arasında olmalı")Karar tablosundan koda
Olasılık çoksa kuralları koşul yazmadan önce bir tabloya dökmek hata yapma ihtimalini azaltabilir. Bu tabloya karar tablosu denir: her satır bir durumu ve o durumda ne yapılacağını gösterir.
Bir kargo uygulamasının basitleştirilmiş kuralı şöyle olsun:
| Sepet toplamı | Üyelik | Kargo ücreti |
|---|---|---|
500 TL veya üzeri |
fark etmez | 0 TL |
500 TL altı |
üye | 20 TL |
500 TL altı |
üye değil | 40 TL |
Bu tabloyu Python’a çevirebiliriz:
sepet = 350
uye_mi = True
if sepet >= 500:
kargo = 0
elif uye_mi:
kargo = 20
else:
kargo = 40
print(kargo)Dikkat edin: ilk koşul doğruysa üyelik bilgisine bakmaya gerek kalmaz. Ayrıca uye_mi zaten bir bool olduğu için elif uye_mi == True: yazmıyoruz.
Değiştir: karar tablosunu sınayın
Aşağıdaki hücrede sepet ve uye_mi değerlerini değiştirerek tablodaki üç satırı da deneyin:
Özellikle şu üç durumu çalıştırın:
sepet = 500,uye_mi = Falsesepet = 499,uye_mi = Truesepet = 499,uye_mi = False
Bu değerler tablodaki 500 TL sınırının iki yanını ve üyelik farkını dener.
Üret: otopark ücretini hesaplayın
Bir otoparkın basitleştirilmiş tarifesi şöyle olsun:
| Süre | Ücret |
|---|---|
0–1 saat |
30 TL |
1 saatten fazla, 3 saate kadar |
60 TL |
3 saatten fazla |
100 TL |
Programı, saat değerine göre doğru ücreti ucret değişkenine atayacak ve ekrana yazdıracak biçimde tamamlayın.
Kabul kriterleri:
- Tam
1saat ilk gruba girmeli. - Tam
3saat ikinci gruba girmeli. 3saatten uzun süreler üçüncü gruba girmeli.- Sonuç
ucretdeğişkeninde tutulmalı ve yazdırılmalı.
Önce saat <= 1, sonra saat <= 3 koşulunu düşünün. İlk koşul False olduysa ikinci koşula gelen değerin 1’den büyük olduğu zaten bellidir.
saat = 2.5
if saat <= 1:
ucret = 30
elif saat <= 3:
ucret = 60
else:
ucret = 100
print(ucret)Tek sayfa özet
Bu hafta programın her çalıştırmada aynı satırlardan geçmek zorunda olmadığını gördük.
if, koşulTrueolduğunda altındaki girintili bloğu çalıştırır.elsebloğu, koşulFalseolduğunda çalışır.- Bağımsız
ifbloklarının her biri ayrı ayrı değerlendirilir; birden fazlası aynı çalıştırmada çalışabilir. elif, yalnızca birinin seçileceği olasılıkları sırayla sınar; koşulu ilkTrueolan blok çalışır.- Zaten
boololan değerlerif uye_mi:biçiminde doğrudan koşul olarak kullanılabilir. and,orvenotile bileşik koşullar kurulabilir.- İkinci karar yalnızca ilk karar sağlandığında anlamlıysa basit iç içe
ifkullanılabilir; tek bir ortak sonuç içinandçoğu zaman daha sadedir. >ile>=arasındaki fark sınır değerinde ortaya çıkar.- Girdiyi kullanmadan önce kabul edilen aralıkta olup olmadığını kontrol etmek gerekir.
- Karar tablosu, birden fazla kuralı koda çevirmeden önce netleştirmeye yarar.
Bir sonraki bölümde aynı kararı bir kez değil, koşul doğru olduğu sürece tekrar tekrar uygulamayı öğreneceğiz.
Bu bölümün kazanımları
Bu bölümü bitiren öğrenci:
ifveelseile kurulan tek karar akışını izler.- Birbirinden bağımsız
ifbloklarıylaif–elifzincirini ayırır. elifsıralamasının sonucu nasıl belirlediğini çözümler.- Sınır değerinde
>ile>=arasındaki farkı gösterir. and,orvenotile bileşik koşul kurar.- Girdiyi kullanmadan önce kabul aralığında olup olmadığını doğrular.
- Zaten
boololan bir değeri doğrudan koşul olarak kullanır.