
BÖLÜM 3 — Kararın Doğuşu: Bir Program Nasıl "Düşünür"?
Bu bölümün temel sorusu: Şimdiye kadar yazdığımız her kod, yukarıdan aşağıya, hiç sapmadan çalıştı. Peki ya program bir duruma göre farklı davranması gerekiyorsa? Bir bilgisayar nasıl "karar verir"?🎯 Bölümün Öğrenme Hedefleri
Bu bölümün sonunda öğrenci;- bir programın neden dallanmaya (branching) ihtiyaç duyduğunu,
- "==" işareti ile "=" işaretinin neden birbirinden tamamen farklı olduğunu,
- "if / elif / else" yapısının nasıl bir karar ağacı oluşturduğunu,
- karşılaştırma ve mantıksal operatörlerin ("and", "or", "not") nasıl birlikte çalıştığını,
- girintilemenin (indentation) Python'da neden süslü parantez yerine geçtiğini,
- iç içe koşulların ne zaman gerekli olduğunu
📌 Geçen Dersde Neler Öğrendik?
2.derste değişkenleri, "=" işaretinin bir atama olduğunu, veri tiplerini ve tip dönüşümünü öğrendik. Ama şu ana kadar yazdığımız her program tek bir yol izledi ve hiçbir satır "atlanmadı", hiçbir seçim yapılmadı. Bu bölümde programın ilk kez seçim yapmasını sağlıyoruz.3.1. Her Şey Bir Sorunla Başladı
Gerçek hayatta hemen her kararımız bir koşula bağlıdır: "Yağmur yağıyorsa şemsiye al", "yaşın 18'den büyükse oy kullanabilirsin", "bakiyen yeterliyse para çek". Bu cümlelerin ortak bir yapısı vardır: Eğer bir şey doğruysa -bir koşul var-, şunu yap; değilse başka bir şey yap. Şimdiye kadar yazdığımız Python kodu bu tür bir esneklikten yoksundu:Kod:
yas = 15
print("Oy kullanabilirsin")
3.2. Büyük Fikir: Yol Ayrımları
Bir programı artık düz bir çizgi değil, yol ayrımları olan bir patika gibi düşünebiliriz. Program bir noktaya gelir, bir soruya bakar ("bu doğru mu?") ve cevaba göre iki (ya da daha fazla) yoldan birini seçer.Kod:
yas = 20
if yas >= 18:
print("Oy kullanabilirsin")
else:
print("Henüz oy kullanamazsın")Burada Python şunu yapar:
- "yas >= 18" ifadesini kontrol eder, bu ifade "True" ya da "False" değerine dönüşür
- "True" ise "if" bloğunun altındaki kodu çalıştırır
- "False" ise "else" bloğunun altındaki kodu çalıştırır
3.3. "==" ile "=" Neden Farklı? (2.Dersteki En Kritik Ayrımın Devamı)
2.derste "=" işaretinin bir atama olduğunu, matematikteki eşitlik olmadığını öğrenmiştik. Şimdi Python'un gerçek eşitlik sorgusu için kullandığı işaretle tanışıyoruz: "=="Kod:
yas = 20 # atama: yas ismine 20 değerini bağla
print(yas == 18) # sorgu: yas, 18'e eşit mi? -> False
print(yas == 20) # sorgu: yas, 20'ye eşit mi? -> TrueDİKKAT
⚠️ En Sık Yapılan Hata: Yeni başlayanların neredeyse tamamı bir noktada şunu yazar:
Python bu satırı görünce hata verir, çünkü "if" bir sorgu bekler (doğru mu yanlış mı?), bir atama değil. Bu, "=" ile "==" nin birbirinden bu kadar net ayrılmasının tam da nedenidir, biri "yap" der, diğeri "kontrol et" der.
Kod:
if yas = 18: # HATA! Python burada "==" bekliyorPython bu satırı görünce hata verir, çünkü "if" bir sorgu bekler (doğru mu yanlış mı?), bir atama değil. Bu, "=" ile "==" nin birbirinden bu kadar net ayrılmasının tam da nedenidir, biri "yap" der, diğeri "kontrol et" der.
3.4. Karşılaştırma Operatörleri: Sorunun Kendisi
Kod:
print(5 > 3) # True
print(5 < 3) # False
print(5 == 5) # True
print(5 != 3) # True (eşit değil mi?)
print(5 >= 5) # True (büyük veya eşit mi?)
print(5 <= 3) # False (küçük veya eşit mi?)3.5. "elif": Birden Fazla Yol Ayrımı
Peki seçenek ikiden fazlaysa? İşte "elif" (else if'in kısaltması) burada devreye girer:Kod:
not_ort = 65
if not_ort >= 85:
print("Notun: AA")
elif not_ort >= 70:
print("Notun: BA")
elif not_ort >= 50:
print("Notun: CB")
else:
print("Notun: FF")DERSTE
💡 Büyük Fikir: Python bu koşulları yukarıdan aşağıya, sırayla kontrol eder ve ilk doğru bulduğu yerde durur, geri kalanlara hiç bakmaz. `not_ort = 65` olduğunda:
- İlk önce "65 >= 85" sorulur → False, devam et
- Sonra "65 >= 70" sorulur → False, devam et
- Sonra "65 >= 50" sorulur → True! Dur, "Notun: CB" yazdır
Bu sıralamanın önemi büyük eğer koşulları ters sıralasaydık (">= 50" en üstte olsaydı), 90 alan biri bile ilk koşulda "CB" alırdı, çünkü Python daha ileriye bakmayacaktı.
- İlk önce "65 >= 85" sorulur → False, devam et
- Sonra "65 >= 70" sorulur → False, devam et
- Sonra "65 >= 50" sorulur → True! Dur, "Notun: CB" yazdır
Bu sıralamanın önemi büyük eğer koşulları ters sıralasaydık (">= 50" en üstte olsaydı), 90 alan biri bile ilk koşulda "CB" alırdı, çünkü Python daha ileriye bakmayacaktı.
3.6. Mantıksal Operatörler: Birden Fazla Koşulu Birleştirmek
Bazen tek bir koşul yetmez, birkaç koşulun aynı anda ya da en az birinin doğru olmasını isteriz:Kod:
yas = 25
ehliyet_var = True
if yas >= 18 and ehliyet_var:
print("Araç kullanabilirsin")
else:
print("Araç kullanamazsın")Üç temel mantıksal operatör vardır:
- and: iki koşul da doğru olmalı → "True and True" = "True", diğer her kombinasyon "False"
- or: koşullardan en az biri doğru olmalı → "True or False" = "True", sadece ikisi de "False" ise sonuç "False"
- not: bir koşulun tersini alır → "not True" = "False"
Kod:
print(True and False) # False
print(True or False) # True
print(not True) # FalseBİLGİ
🤔 Neden Bu Üç Operatöre İhtiyaç Var?Çünkü gerçek hayattaki kararlar nadiren tek bir şarta bağlıdır. "18 yaşından büyük ve ehliyeti varsa araç kullanabilir" cümlesi, iki koşulun birlikte doğru olmasını gerektirir tek bir karşılaştırma operatörüyle bunu ifade edemeyiz.
3.7. Girintileme (Indentation): Python'un Süslü Parantez Yerine Kullandığı Şey
Diğer birçok dilde (C, Java gibi) hangi kodun hangi koşula ait olduğunu süslü parantezler "{ }" belirler. Python bu yaklaşımı bilinçli olarak reddetti ve bunun yerine girintilemeyi (satır başındaki boşlukları) kullanır:Kod:
if yas >= 18:
print("Bu satır if bloğuna ait")
print("Bu satır da öyle")
print("Bu satır artık if bloğunun dışında")BİLGİ
🤔 Neden Böyle Tasarlanmış: Guido van Rossum'un birinci derste bahsettiğimiz felsefesini hatırlayın, "kod, okunabilir olmalı". Süslü parantezli dillerde bile programcılar genelde kodu okunaklı tutmak için zaten girintileme yaparlar. Python bunu bir alışkanlık olmaktan çıkarıp zorunlu bir kural hâline getirdi. Böylece kodun görünüşü ile kodun gerçek yapısı birbirinden asla ayrışamaz.
3.8. İç İçe Koşullar (Nested Conditionals)
Bazen bir koşulun içinde başka bir koşula ihtiyaç duyarız:Kod:
yas = 20
bilet_var = True
if yas >= 18:
if bilet_var:
print("İçeri girebilirsin")
else:
print("Bilet almalısın")
else:
print("Yaşın yetmiyor")Burada dış "if" önce yaşı kontrol eder, sadece o doğruysa iç "if" e bakılır. Bu, tıpkı bir güvenlik kontrolünden geçip sonra ikinci bir kontrolden geçmek gibidir önceki kapı kapalıysa, ikinci kapıya hiç bakılmaz.
🤔 Peki Ne Zaman İç İçe Koşul, Ne Zaman "and" ?
Bu iki kod parçası aslında aynı sonucu verir:Kod:
if yas >= 18 and bilet_var:
print("İçeri girebilirsin")⚠️ Kavram Yanılgıları
❌ Yanlış düşünce: " 'elif' bloklarının hepsi kontrol edilir, hangileri doğruysa hepsi çalışır."✅ Daha doğru düşünce: Python, "if / elif / else" zincirinde ilk doğru bulduğu koşulun bloğunu çalıştırır ve zincirin geri kalanına hiç bakmaz. Birden fazla koşulun bağımsız olarak kontrol edilmesini istiyorsan, ayrı "if" blokları yazman gerekir.
❌ Yanlış düşünce: "Girintileme sadece görsel bir tercih, boşluk sayısı önemli değil."
✅ Daha doğru düşünce: Python'da girintileme, kodun hangi bloğa ait olduğunu belirleyen yapısal bir kuraldır süs değildir. Aynı blok içindeki satırların girinti miktarı tutarlı olmalıdır, aksi hâlde program hata verir.
👨🏫 Öğretmen Notu
Koşullu ifadeler anlatılırken doğrudan "if/elif/else" sözdizimine geçilmesi, öğrencinin "neden bu yapıya ihtiyacım var" sorusunu atlamasına yol açar. Önerilen sıra:- Önce günlük hayattan bir "eğer... ise..." örneği verilir (yağmur/şemsiye gibi).
- Şimdiye kadarki kodun neden hep aynı sonucu verdiği (dallanma olmadığı) fark ettirilir.
- "==" işareti, ikinci dersteki "=" ile doğrudan karşılaştırılarak verilir bu ayrım atlanırsa öğrenci ileride ciddi hatalar yapar.
- "if/else" ikili yapıyla başlanır, sonra "elif" ile çoklu dallanmaya geçilir.
- "and/or/not" ancak tek koşulun yetmediği somut bir örnekle (yaş + ehliyet gibi) tanıtılır.
✍️ Uygulama Soruları
Soru 1: Bir sayının pozitif, negatif ya da sıfır olduğunu yazdıran kodu yaz (sayıyı siz seçin).Soru 2: Aşağıdaki kod neden hata verir?
Kod:
yas = 20
if yas = 20:
print("Yirmi yaşındasın")Soru 3: Bir kullanıcının hem 18 yaşından büyük hem de bir üyelik kodu girmiş olması gerektiğini kontrol eden kodu yaz.
Soru 4: Aşağıdaki kodun çıktısı ne olur, neden?
Kod:
puan = 90
if puan >= 50:
print("Geçtin")
elif puan >= 80:
print("Yüksek başarı")
else:
print("Kaldın")Soru 5: İç içe koşul ile `and` kullanarak yazılmış iki kod ne zaman birbirinin yerine geçebilir?
📌 Şu Ana Kadar Neler Öğrendik?
- Programların neden dallanmaya (branching) ihtiyaç duyduğu
- "if / elif / else" yapısının nasıl bir karar ağacı oluşturduğu
- "==" işaretinin "=" den (atama) tamamen farklı olduğu, eşitlik sorguladığı
- Karşılaştırma operatörleri ("> < == != >= <=")
- Mantıksal operatörler (`and`, `or`, `not`) ve birden fazla koşulu birleştirme
- Girintilemenin Python'da süslü parantez yerine geçen zorunlu bir kural olduğu
- İç içe koşulların ne zaman gerekli, ne zaman gereksiz olduğu
📌 Bu Bölümden Çıkarılacak En Önemli Sonuç
Koşullu ifadeler bir formülle başlamadı, gerçek hayattaki "eğer... ise..." kararlarını bilgisayara aktarma ihtiyacından doğdu. Python bu ihtiyacı "if / elif / else" ile karşılar ve her koşulu sırayla, ilk doğru bulduğunda durarak değerlendirir. Bu yapı, bir programı düz bir çizgiden çıkarıp gerçek anlamda "karar veren" bir sisteme dönüştürür.📝 Bölümün Kısa Özeti
Koşullu ifadeler, bir programın duruma göre farklı davranmasını sağlar. "if" bir koşulu kontrol eder, doğruysa altındaki bloğu çalıştırır; "elif" ek koşullar eklemeyi, "else" hiçbir koşul sağlanmadığında ne yapılacağını belirler. Python koşulları sırayla kontrol eder ve ilk doğru bulduğunda durur. "==" eşitlik sorgular, "=" ile karıştırılmamalıdır. "and", "or", "not" operatörleri birden fazla koşulu birleştirmeyi sağlar. Python, hangi kodun hangi bloğa ait olduğunu süslü parantez yerine girintilemeyle belirler.✍️ Uygulamanın Cevapları
cevap 1: Ben -5 sayısına göre yazdım.Kod:
python
sayi = -5
if sayi > 0:
print("Pozitif")
elif sayi < 0:
print("Negatif")
else:
print("Sıfır")cevap 2:"if" bir eşitlik sorgusu ("==") bekler, atama ("=") değil. Doğrusu: "if yas == 20:"
cevap 3:
Kod:
yas = 22
uyelik_kodu_var = True
if yas >= 18 and uyelik_kodu_var:
print("Üyeliğin onaylandı")
else:
print("Koşulları sağlamıyorsun")cevap 4: "Geçtin" yazdırılır. Çünkü Python koşulları sırayla kontrol eder ve ilk doğru bulduğu koşulda durur "puan >= 50" zaten "True" olduğu için, aslında daha yüksek bir başarıyı belirten "puan >= 80" koşuluna hiç bakılmaz. Bu kod, koşulların sıralamasının neden önemli olduğunu gösteren tipik bir hatadır.
cevap 5: Koşullar tek bir soru soruyorsa ("ikisi de doğru mu?") ve her koşul için ayrı bir "else" mesajına ihtiyaç yoksa, "and" kullanmak daha sade olur. Her koşul için bağımsız bir sonuç/mesaj gerekiyorsa, iç içe "if" yapısı daha nettir.
Bir Program Nasıl "Düşünür"? (Python 3.Ders)
