Koşullar ve girdi doğrulama

Geçen hafta karşılaştırmaların True veya False ürettiğini gördük. Şimdi bu sonuçları kullanarak programın hangi kodu çalıştıracağına karar vereceğiz.

Bir program her durumda aynı adımları izlemek zorunda değildir. Öğrenci notu geçme sınırının üzerindeyse başka, altındaysa başka çıktı üretilebilir; kullanıcı geçersiz bir değer girdiyse normal hesaplamaya devam etmek yerine uyarı verilebilir. Bu tür kararlar koşullar ile kurulur.

Bu bölümün kapsamı

NoteSınavda sorulur
  • if / else akışını izleme
  • bağımsız if blokları ile ifelif zincirinin farkı
  • elif sıralamasının sonucu belirlemesi ve erişilemez blok
  • sınır değerinde > ile >= farkı
  • and, or ve not ile bileşik koşul kurma
  • girdiyi kullanmadan önce kabul aralığını doğrulama
  • bool değ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 programda da aynı koşullar yazılmış olabilir; fark sıralamada ya da tek bir karşılaştırma işaretindedir. Bu bölümde amacımız, bir kararın hangi durumda hangi yolu seçeceğini kodu çalıştırmadan görebilmek.

if: koşul doğruysa çalıştır

En temel karar yapısı if ile kurulur:

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.

Burada üç yazım ayrıntısı önemlidir:

  • Koşul if anahtar sözcüğünden sonra gelir,
  • Koşul satırı : ile biter,
  • Koşula bağlı kod içeriye doğru girintilenir.
if koşul:
    koşul doğruysa çalışacak kod
Warning

Python’da girinti yalnızca görsel düzen değildir; programın yapısının bir parçasıdır. Aynı karar bloğundaki 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?

ifelse: iki olasılıktan biri

Koşul sonucuna göre iki farklı yürütme yolunu gösteren if/else karar akışı.

if/else karar akışı

İki birbirini dışlayan durum varsa else kullanabiliriz:

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 programda puan = 60 için hangi çıktı üretilmelidir?

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?

Bir koşulun değiştiği noktaya yakın değerler özellikle önemlidir. Geçme sınırı 60 ise yalnızca 80 ve 30 ile denemek yeterli değildir.

En azından şu üç değer düşünülmelidir:

Puan Beklenen
59 Kaldı
60 Geçti
61 Geçti

60 burada bir sınır değeridir. > ile >= arasındaki küçük bir fark tam bu noktada görünür.

59, 60 ve 61 değerlerinin geçme sınırı etrafındaki durumunu gösteren sınır değeri örneği.

Sınır değeri
Tip

Bir koşul yazdıktan sonra “koşulun hemen altındaki, tam üzerindeki ve hemen üstündeki değer ne olur?” sorusunu sorun.

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şulları yukarıdan aşağıya değerlendirir ve ilk True olan bloğu çalıştırdıktan sonra bu zincirden çıkar.

Bağımsız if ile ifelif aynı şey değildir

Öğrencilerin sık yaptığı hatalardan biri, birbirini dışlayan sınıflandırmaları ayrı if bloklarıyla yazmaktır:

puan = 95

if puan >= 90:
    print("AA")

if puan >= 80:
    print("BA")

Burada iki if bağımsızdır. 95 her iki koşulu da sağladığı için iki satır çıktı oluşur:

AA
BA

Eğer amaç öğrenciyi tek bir harf notuna yerleştirmekse zincir kurulmalıdır:

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.

Note

Bağımsız if kullanmak başlı başına yanlış değildir. Aynı kişi için birden fazla bağımsız özelliği kontrol etmek istiyorsanız birden fazla if doğru olabilir. Yanlış olan, birbirini dışlaması gereken seçenekleri yanlışlıkla bağımsız kontrol etmektir.

Bu yüzden elif zincirinde sıra da önemlidir. Aşağıdaki yazım hatalı bir sınıflandırma üretir:

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 bir sıcaklığı sınıflandırıyor. 32 derece için "Sıcak" yazması gerekir; ancak mevcut sıra bunu engelliyor.

Koşulları, 30 ve üzeri "Sıcak", 2029 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 tek bir karşılaştırma yeterli değildir. Örneğin bir sınav puanının geçerli olması için hem 0 veya daha büyük hem de 100 veya daha küçük olması gerekir:

puan = 85
gecerli_mi = puan >= 0 and puan <= 100
print(gecerli_mi)

Python’da bu özel sayısal aralık daha kısa da yazılabilir:

gecerli_mi = 0 <= puan <= 100

İki yazım aynı fikri anlatır.

or ise alternatiflerden en az birinin yeterli olduğu durumlarda kullanılır:

gun = "Cumartesi"

if gun == "Cumartesi" or gun == "Pazar":
    print("Hafta sonu")

not bir mantıksal sonucu tersine çevirir:

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")

False durumunu açıkça sınamak istediğinizde de çoğu zaman:

if not uye_mi:
    print("Standart ücret uygulanır")

biçimi daha doğal okunur.

İç içe if: ikinci karar yalnızca ilkinden sonra anlamlıysa

Bazen ikinci bir koşulu ancak ilk koşul sağlandığında değerlendirmek isteriz. Örneğin sisteme giriş yapmamış bir kullanıcı için rol kontrolü yapmanı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.

Aynı tek sonucu gerektiren daha basit bir durumda and daha açık olabilir:

if giris_yapti and rol == "yonetici":
    print("Yönetim ekranı")

Başlangıç kuralı olarak:

  • İki koşul aynı sonucu birlikte belirliyorsa, çoğu zaman and daha kısadır.
  • İkinci karar yalnızca birinci kararın içindeyken anlamlıysa veya farklı hata/mesaj yolları gerekiyorsa, iç içe if daha açıklayıcı olabilir.
Tip

İç içe koşulları gereksiz yere derinleştirmeyin. Aynı düşünce tek bir okunabilir bileşik koşulla anlatılabiliyorsa daha sade olanı tercih edin.

Önce doğrula, sonra işlem yap

Geçersiz girdiyi ayıklayıp yalnızca geçerli değerlerle işleme devam etme akışı.

Önce doğrula, sonra işle

Kullanıcıdan gelen her değerin geçerli olduğunu varsaymak iyi bir alışkanlık değildir. Örneğin sınav puanı 0 ile 100 arasında olmalıdır.

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 başarıyla dönüştürülebildiğini varsayıyoruz. Yani "abc" gibi bir girişin int() dönüşümünde oluşturacağı hatayı henüz ele almıyoruz. Şimdilik sayısal ama aralık dışındaki değerleri doğruluyoruz.

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

Koşul yazmadan önce kuralları tablo hâline getirmek, özellikle birden fazla olasılık olduğunda hatayı azaltabilir.

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 = False
  • sepet = 499, uye_mi = True
  • sepet = 499, uye_mi = False

Bu değerler karar tablosundaki sınırları doğrudan sınar.

Üret — otopark ücretini hesaplayın

Bir otoparkın basitleştirilmiş tarifesi şöyle olsun:

Süre Ücret
01 saat 30 TL
1 saatten fazla, 3 saate kadar 60 TL
3 saatten fazla 100 TL

Aşağıdaki başlangıç değerini kullanarak uygun ücreti ucret değişkenine atayan ve ekrana yazdıran programı tamamlayın.

Kabul kriterleri:

  • 1 saat tam olarak ilk grupta olmalı.
  • 3 saat tam olarak ikinci grupta olmalı.
  • 3 saatten büyük değerler üçüncü gruba gitmeli.
  • Sonuç ucret değişkeninde tutulmalı ve yazdırılmalı.

Önce saat <= 1, sonra saat <= 3 koşullarını düşünün. İlk koşul başarısız olduğunda ikinci koşula gelen değerin zaten 1’den büyük olduğunu biliyoruz.

saat = 2.5

if saat <= 1:
    ucret = 30
elif saat <= 3:
    ucret = 60
else:
    ucret = 100

print(ucret)

Sınav provası

Önce kendi cevabını seç; sonra cevap anahtarında her şıkkın neden doğru veya yanlış olduğunu oku. Çeldiriciler uydurma değil, bu konuda gerçekten yapılan hatalardır. Sınav maddeleri de bu mantıkla yazılır.

Madde 1. puan = 45 iken aşağıdaki program ne yazdırır?

if puan >= 50:
    print("Geçti")
else:
    print("Kaldı")
  • A. Önce Geçti, sonra Kaldı
  • B. Geçti
  • C. Hata verir; puan karşılaştırmadan önce dönüştürülmelidir
  • D. Kaldı
  • E. Hiçbir şey yazmaz

Madde 2. Aşağıdaki program kaç satır yazdırır?

puan = 95
if puan >= 90:
    print("AA")
if puan >= 80:
    print("BA")
  • A. 3
  • B. 1
  • C. 0
  • D. Hata verir; aynı değişken için iki if yazılamaz
  • E. 2

Madde 3. Aynı puan için aşağıdaki iki yapı neden farklı sonuç verir?

# A
if puan >= 90:
    print("AA")
if puan >= 80:
    print("BA")

# B
if puan >= 90:
    print("AA")
elif puan >= 80:
    print("BA")
  • A. A’da her koşul ayrı ayrı sınanır ve birden fazlası çalışabilir; B’de ilk doğru koşuldan sonra zincir biter
  • B. A hata verir; arka arkaya iki if yazılamaz
  • C. B daha hızlı çalıştığı için farklı sonuç verir
  • D. İkisi de aynı sonucu verir; elif yalnızca kısa yazımdır
  • E. B’de else olmadığı için hiçbir blok çalışmaz

Madde 4. Aşağıdaki zincir puan = 95 için ne yazdırır?

puan = 95

if puan >= 70:
    print("70 veya üzeri")
elif puan >= 90:
    print("90 veya üzeri")
  • A. İki satır da yazılır
  • B. 70 veya üzeri
  • C. 90 veya üzeri
  • D. Hiçbir şey yazmaz
  • E. Hata verir; elif koşulu if koşulundan dar olamaz

Madde 5. if puan > 60 ile if puan >= 60 arasındaki fark hangi değerde görünür?

  • A. 60tan küçük bütün değerlerde
  • B. Yalnızca puan ondalıklı olduğunda
  • C. Yalnızca puan tam olarak 60 iken
  • D. 60tan büyük bütün değerlerde
  • E. Hiçbir değerde; iki yazım aynıdır

Madde 6. Bir indirim yalnızca öğrenci olan ve yaşı 25in altında olan kişilere uygulanacak. Hangi koşul doğrudur?

  • A. if ogrenci_mi, yas < 25:
  • B. if ogrenci_mi == yas < 25:
  • C. if ogrenci_mi and not yas < 25:
  • D. if ogrenci_mi and yas < 25:
  • E. if ogrenci_mi or yas < 25:

Madde 7. Kullanıcıdan alınan puanla işlem yapmadan önce neden kabul aralığı kontrol edilir?

  • A. Kontrol olmazsa input() çalışmaz
  • B. Kontrol programın daha hızlı çalışmasını sağlar
  • C. Böylece tür dönüşümü gereksiz hâle gelir
  • D. Python aralık dışındaki sayıları saklayamaz
  • E. Aralık dışındaki bir değer programın geri kalanında sessizce yanlış sonuç üretebilir

Madde 8. uye_mi zaten True veya False tutuyorsa if uye_mi: yazımı neden if uye_mi == True: yazımından daha doğaldır?

  • A. Değer zaten bir bool olduğu için karşılaştırma yeni bilgi eklemez; koşul doğrudan değerin kendisidir
  • B. if uye_mi: daha hızlı çalıştığı için zorunludur
  • C. İkisi farklı sonuç verir; if uye_mi: yalnızca sayılarda çalışır
  • D. == True yazımı değişkenin değerini değiştirir
  • E. == True karşılaştırması Python’da hata verir

Madde 1 — Doğru: D. 45 >= 50 yanlış olduğu için else bloğu çalışır.

  • A yanlış: if ve else birbirini dışlar; ikisi aynı çalıştırmada birden çalışamaz.
  • B yanlış: Koşul sağlanmıyor; if bloğu atlanır.
  • C yanlış: puan zaten bir sayı; dönüşüme gerek yok.
  • E yanlış: else bloğu her zaman bir çıkış yolu bırakır; en az bir satır yazılır.

Madde 2 — Doğru: E. İki blok birbirinden bağımsızdır ve her ikisinin koşulu da 95 için sağlanır.

  • A yanlış: Yalnızca iki print() çağrısı var.
  • B yanlış: Bağımsız if blokları birbirini durdurmaz; ilki çalıştıktan sonra ikincisi de sınanır.
  • C yanlış: 95 her iki koşulu da sağlıyor.
  • D yanlış: Aynı değişken istenildiği kadar sınanabilir.

Madde 3 — Doğru: A. elif zinciri en fazla bir bloğu çalıştırır. Bağımsız iflerde böyle bir sınır yoktur.

  • B yanlış: Arka arkaya if yazmak geçerlidir.
  • C yanlış: Fark hızda değil, kaç bloğun çalıştığında.
  • D yanlış: Kısaltma değil, akışı değiştiren bir yapıdır.
  • E yanlış: else zorunlu değildir; koşullardan biri sağlanırsa o blok çalışır.

Madde 4 — Doğru: B. Zincir ilk sağlanan koşulda durur. 95 >= 70 doğru olduğu için elif hiç sınanmaz — koşullar yanlış sıralanmış.

  • A yanlış: elif zincirinde en fazla bir blok çalışır.
  • C yanlış: Bu blok yalnızca ilk koşul yanlışsa sınanır; burada ilk koşul zaten doğru.
  • D yanlış: İlk koşul sağlanıyor; blok çalışır.
  • E yanlış: Böyle bir kural yok. Kod çalışır ama mantık hatası içerir.

Madde 5 — Doğru: C. Sınırın kendisi > ile dışarıda, >= ile içeride kalır. Diğer bütün değerlerde iki koşul aynı davranır.

  • A yanlış: 59 her iki koşulda da yanlıştır.
  • B yanlış: Tür değil, sınırın kapsanıp kapsanmaması belirleyici.
  • D yanlış: 61 her iki koşulu da sağlar; fark yalnızca sınırın kendisindedir.
  • E yanlış: Sınır değerinde farklı sonuç verirler.

Madde 6 — Doğru: D. İki şartın da sağlanması isteniyor; and tam olarak bunu ifade eder.

  • A yanlış: Koşullar virgülle birleştirilmez; mantıksal işleç gerekir.
  • B yanlış: Bu, iki ayrı şartı birleştirmez; anlamsız bir karşılaştırma kurar.
  • C yanlış: not ikinci şartı tersine çevirir; indirim 25 yaş ve üstüne verilir.
  • E yanlış: or ile tek şart yeterli olur; öğrenci olmayan genç de indirim alır.

Madde 7 — Doğru: E. -40 veya 250 gibi bir puan hata vermeden ortalamaya karışır; sorun ancak çok sonra fark edilir.

  • A yanlış: input() her değeri alır; doğrulama ayrı bir adımdır.
  • B yanlış: Ek kontrol hız kazandırmaz; amacı sonucun güvenilirliğidir.
  • C yanlış: Aralık kontrolü dönüşümün yerini tutmaz; ikisi ayrı işlerdir.
  • D yanlış: Python bu değerleri sorunsuz saklar; sınırı koyan programcıdır.

Madde 8 — Doğru: A. uye_mi == True ifadesi yine True ya da False üretir, yani aynı değeri bir tur dolaştırır.

  • B yanlış: Hız farkı ölçülebilir düzeyde değildir; tercih okunabilirlik gerekçesiyle yapılır.
  • C yanlış: bool değerlerde ikisi de aynı sonucu verir.
  • D yanlış: Karşılaştırma değişkene dokunmaz.
  • E yanlış: Hata vermez; yalnızca gereksizdir.

Tek sayfa özet

Bu hafta programın tek bir doğrusal yol izlemesi gerekmediğini gördük.

  • if bir koşul True olduğunda ilgili bloğu çalıştırır.
  • else ilk koşul False olduğunda alternatif yolu verir.
  • Bağımsız if bloklarının her biri ayrı ayrı değerlendirilir; birden fazlası aynı çalıştırmada çalışabilir.
  • elif birden fazla birbirini dışlayan olasılığı sırayla sınamak için kullanılır; ilk True olan blok çalışır.
  • Zaten bool olan değerler if uye_mi: biçiminde doğrudan koşul olarak kullanılabilir.
  • and, or ve not ile bileşik koşullar kurulabilir.
  • İkinci karar yalnızca ilk karar sağlandığında anlamlıysa basit iç içe if kullanılabilir; tek bir ortak sonuç için and çoğu zaman daha sadedir.
  • Sınır değerleri, > ile >= gibi küçük farkların davranışını görünür kılar.
  • Girdiyi kullanmadan önce kabul edilen aralıkta olup olmadığını kontrol etmek gerekir.
  • Karar tablosu, birden fazla kuralı koda çevirmeden önce açıklaştırmak için kullanışlıdır.

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:

  • if ve else ile kurulan tek karar akışını izler.
  • Birbirinden bağımsız if bloklarıyla ifelif zincirini ayırır.
  • elif sıralamasının sonucu nasıl belirlediğini çözümler.
  • Sınır değerinde > ile >= arasındaki farkı gösterir.
  • and, or ve not ile bileşik koşul kurar.
  • Girdiyi kullanmadan önce kabul aralığında olup olmadığını doğrular.
  • Zaten bool olan bir değeri doğrudan koşul olarak kullanır.
Back to top