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 hafta neleri yapabilmelisiniz?

Bölümün sonunda:

  • if, elif ve else yapılarını doğru girintiyle yazabilmeli,
  • bir koşulun True ve False olduğu durumlarda hangi kodun çalışacağını izleyebilmeli,
  • and, or ve not ile bileşik koşullar kurabilmeli,
  • karar sırasının elif yapısındaki sonucu nasıl etkilediğini açıklayabilmeli,
  • sınır değerlerini belirleyip örneklerle kontrol edebilmeli,
  • basit bir karar tablosunu Python koşullarına dönüştürebilmeli,
  • sayısal bir girdinin geçerli aralıkta olup olmadığını kontrol edebilmeli,
  • kısa bir koşul programındaki mantık hatasını bulup düzeltebilmelisiniz.

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

İ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.

Geçme koşulunda 59, 60 ve 61 puanlarının sınır değeri çevresinde nasıl farklı sonuçlara ayrıldığını gösteren karar şeması.
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.

Bu yüzden sıra ö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")

Önce doğrula, sonra işlem yap

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.

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)

Bölüm özeti

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.
  • elif birden fazla olasılığı sırayla sınamak için kullanılır.
  • elif zincirinde ilk True olan blok çalışır; bu yüzden koşul sırası önemlidir.
  • and, or ve not ile bileşik koşullar kurulabilir.
  • 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.

Kendinizi kontrol edin

Kodu çalıştırmadan cevaplamaya çalışın:

  1. if puan > 60 ile if puan >= 60 arasındaki fark hangi değerde özellikle görünür?
  2. Bir ifelifelse zincirinde iki koşul da True ise kaç blok çalışır?
  3. Aşağıdaki kod 95 için ne yazdırır?
puan = 95

if puan >= 70:
    print("70 veya üzeri")
elif puan >= 90:
    print("90 veya üzeri")
  1. 0 <= puan <= 100 koşulu hangi değerleri kabul eder?
  2. Bir yaş alanı 16120 aralığındaysa hangi dört değeri sınır testi olarak seçmek yararlı olur?
  3. Karar tablosu yazmak hangi tür hataları azaltabilir?

Bir sonraki bölümde aynı kararı bir kez değil, koşul doğru olduğu sürece tekrar tekrar uygulamayı öğreneceğiz.

Back to top