Karar Yapıları: if, elif, else
Bu derste ne yapacağız?
Bir önceki derste input() fonksiyonuyla kullanıcıdan veri almayı ve karşılaştırma operatörlerini (==, >, < gibi) kullanarak iki değeri kıyaslamayı öğrenmiştik. Bu derste bir adım öteye geçiyoruz: programımızın, bu karşılaştırmaların sonucuna göre farklı işler yapmasını sağlayacağız. Yani programımıza artık "eğer şu doğruysa bunu yap, değilse şunu yap" diyebileceğiz. Bunu Python'da if, elif ve else anahtar kelimeleriyle yapacağız.
Ön koşul: Değişkenleri tanımlamayı, input() ile veri almayı ve temel karşılaştırma/mantıksal operatörleri (==, !=, >, <, >=, <=, and, or, not) az çok bilmen yeterli. Bunlardan emin değilsen bir önceki dersi tekrar gözden geçirebilirsin. Tahmini süre: 14 dakika.
Kavram
Günlük hayatta sürekli karar yapıları kullanırız, sadece bunun farkında olmayız. Örneğin: "Eğer dışarıda yağmur yağıyorsa şemsiye alırım, yağmıyorsa almam." Ya da bir kafede: "Eğer param 50 liradan fazlaysa büyük boy kahve alırım, 20 liradan fazlaysa orta boy alırım, değilse küçük boy alırım." Bu cümlelerde bir koşul (dışarıda yağmur yağıyor mu?) ve bu koşulun doğru ya da yanlış olmasına göre izlenecek farklı yollar vardır.
Python'da bu mantığı üç anahtar kelimeyle kuruyoruz: if ("eğer"), elif ("değilse ve eğer" - else if'in kısaltması) ve else ("değilse"). Program, if satırındaki koşulu kontrol eder; koşul True (doğru) ise altındaki kod bloğu çalışır ve karar yapısı biter. Koşul False (yanlış) ise sıradaki elif koşuluna bakılır; o da yanlışsa bir sonrakine geçilir. Hiçbir koşul doğru çıkmazsa, en sonda varsa else bloğu çalışır. Bir if-elif-else zincirinde en fazla bir blok çalışır, hiçbir zaman ikisi birden değil.
Python'da başka birçok dilden farklı olarak kod bloklarını süslü parantez { } yerine girinti (indentation) ile belirtiriz. Yani if satırının altındaki, sağa kaymış satırlar, o if'e ait bloktur. Bu girinti Python'da süs değil, kuraldır; yanlış girinti hataya yol açar.
Adım adım uygulama
Aşağıdaki adımları kendi bilgisayarında, öğrendiğin editörde (örneğin IDLE ya da tercih ettiğin başka bir düzenleyici) uygulayarak ilerle. Arayüz kullandığın sürüme göre küçük farklılıklar gösterebilir; adımların mantığı aynı kalır.
- Yeni bir Python dosyası oluştur ve yas_kontrol.py gibi bir isimle kaydet.
- İlk satıra kullanıcıdan yaşını isteyen ve sayıya çeviren şu satırı yaz: yas = int(input("Yaşınızı girin: "))
- Bu satırın altına, girintisiz (en sola dayalı) şekilde şu satırı ekle: if yas >= 18: — dikkat et, satırın sonunda iki nokta üst üste : olmalı, bu Python'a "bloğun burada başladığını" söyler.
- Bir alt satıra geç ve klavyede Tab tuşuna bas ya da dört boşluk bırak, sonra şunu yaz: print("Reşitsiniz.") Bu satır if bloğuna aittir.
- Girintiyi geri al (satırı en sola getir) ve şunu yaz: elif yas >= 13: — yine sonunda iki nokta olmalı.
- Bir alt satıra Tab ile girinti vererek şunu yaz: print("Ergenlik döneminizdesiniz.")
- Girintiyi geri al ve şunu yaz: else:
- Bir alt satıra Tab ile girinti vererek şunu yaz: print("Çocukluk döneminizdesiniz.")
- Dosyayı kaydet (Dosya menüsünden Kaydet ya da Ctrl+S) ve çalıştır (IDLE'da Run menüsünden Run Module ya da F5).
- Terminalde yaşını farklı değerlerle (örneğin 10, 15, 25) birkaç kez dene ve her seferinde doğru mesajın çıktığını gözlemle.
Yazdığın program şu satırlardan oluşuyor olmalı:
- yas = int(input("Yaşınızı girin: ")) — kullanıcıdan metin olarak alınan veriyi tam sayıya (int) çevirip yas adlı değişkende saklar.
- if yas >= 18: — yaş 18 veya üzeriyse aşağıdaki bloğu çalıştırır.
- print("Reşitsiniz.") — if koşulu doğruysa ekrana bu mesajı yazar (if satırına göre içeri kaydırılmış olmalı).
- elif yas >= 13: — bir önceki koşul (18 ve üzeri) yanlışsa ve yaş 13 veya üzeriyse bu bloğu çalıştırır.
- print("Ergenlik döneminizdesiniz.") — elif satırına göre içeri kaydırılmış olmalı.
- else: — yukarıdaki koşulların hiçbiri doğru değilse (yani yaş 13'ten küçükse) bu blok çalışır.
- print("Çocukluk döneminizdesiniz.") — else satırına göre içeri kaydırılmış olmalı.
Python koşulları yukarıdan aşağıya sırayla kontrol eder ve ilk doğru bulduğu bloğu çalıştırıp zincirden çıkar; bu yüzden koşulların sırası önemlidir. Örneğin önce yas >= 13 yazıp sonra yas >= 18 yazsaydık, 20 yaşındaki biri için de "Ergenlik döneminizdesiniz." çıkardı çünkü program ilk doğru koşulda durur ve devamına bakmaz.
İstersen tek bir if içinde birden fazla koşulu and / or ile birleştirmeyi de deneyebilirsin, örneğin: if yas >= 13 and yas < 18: satırı "13 ve 18 arasında" anlamına gelir; and her iki koşulun da doğru olmasını, or ise en az birinin doğru olmasını gerektirir.
Sık karşılaşılan sorunlar
| Hata / Belirti | Olası Neden | Çözüm |
|---|---|---|
| IndentationError: expected an indented block | if satırından sonraki satır girintisiz bırakılmış | if, elif veya else satırının altındaki satırı Tab tuşuyla veya dört boşlukla içeri kaydır |
| SyntaxError: expected ':' | if/elif/else satırının sonuna iki nokta üst üste konmamış | Koşul satırının en sonuna : işareti ekle |
| Koşul her zaman aynı sonucu veriyor | == yerine tek = kullanılmış (atama ile karşılaştırma karıştırılmış) | Karşılaştırma için mutlaka çift eşittir == kullan, tek = atamadır |
| ValueError: invalid literal for int() | Kullanıcı sayı yerine harf girmiş, int() metni sayıya çeviremiyor | Şimdilik programı sayı girerek test et; hataları yakalamayı ileriki bir derste öğreneceğiz |
| Yanlış blok çalışıyor gibi görünüyor | Koşulların sırası mantıksal olarak yanlış kurulmuş | En dar/özel koşulu üste, en genel koşulu (else) en alta yerleştir |
Mini görev
Bir not değerlendirme programı yaz. Kullanıcıdan bir sınav notu (0-100 arası) al ve şu kurallara göre harf notu bastır: 85 ve üzeri "AA", 70-84 arası "BA", 50-69 arası "CB", 50'nin altı "FF". Bunun için birden fazla elif satırı kullanman gerekecek.
- Değişken adı olarak not_puani gibi anlamlı bir isim kullandım mı?
- Kullanıcıdan aldığım veriyi int() ile sayıya çevirdim mi?
- if, elif, else satırlarının her birinin sonunda iki nokta üst üste var mı?
- Her bloktaki print() satırı doğru girintiye sahip mi?
- Programı en az dört farklı notla (örneğin 95, 75, 55, 30) test edip her seferinde doğru harf notunun çıktığını gördüm mü?
Kendini sına
1) Python'da bir if-elif-else zincirinde en fazla kaç blok çalışabilir?
2) Aşağıdaki satırda eksik olan noktalama işareti nedir? if yas >= 18
3) Python kod bloklarını neyle belirler: süslü parantez mi, girinti mi?
4) if sayi == 5: satırındaki == işareti ne işe yarar, tek = ile karıştırılırsa ne olur?
5) İki koşulun da aynı anda doğru olmasını istediğimizde hangi mantıksal operatörü kullanırız: and mı, or mu?
Cevaplar
1) En fazla bir blok çalışır; ilk doğru bulunan koşulun bloğu çalışır ve zincirden çıkılır.
2) İki nokta üst üste (:) eksik; doğrusu if yas >= 18: olmalıdır.
3) Python kod bloklarını girinti (boşluk veya Tab ile yapılan içeri kaydırma) ile belirler, süslü parantez kullanmaz.
4) == iki değeri karşılaştırır ve eşit olup olmadığını True/False olarak döndürür; tek = ise atama yapar, bir değişkene değer verir. Koşul içinde yanlışlıkla tek = kullanmak Python'da genelde SyntaxError hatası verir.
5) İki koşulun da aynı anda doğru olması gerektiğinde and kullanılır; or ise koşullardan sadece birinin doğru olması yeterli olduğunda kullanılır.
Bir sonraki derste (6/8) programın belirli bir işi tekrar tekrar yapmasını sağlayan for ve while döngülerini öğreneceğiz; burada kurduğun karar yapıları döngülerle birleşince çok daha güçlü programlar yazabileceksin.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol