7  Karar Yapıları

if/elif/else + comparison + logic — torch.where ve attention masking’in atası

NotBölüm bilgisi

7.1 Bu Derste Ne Var?

Şimdiye kadar kod hep yukarıdan aşağı doğrusal çalıştı. Ders 6’da ilk dallanmayı ekleyeceğiz: “şu durumda bunu yap, başka durumda diğerini.” Bu, Python’u (ve genel olarak programlamayı) “düz hesaplayıcı”dan karar verebilen akıllı bir araca dönüştürür.

flowchart LR
    A["if koşul:"] --> B["else / elif"]
    B --> C["Comparisons<br/>== != < > <= >="]
    C --> D["Logic<br/>and / or / not"]
    D --> E["Truthy/Falsy"]
    E --> F["💡 if liste:"]
    D --> G["💎 mask = x > 0"]
    G --> H["➡️ torch.where(x>0, x, 0)"]
    H --> I["= ReLU!"]

    style A fill:#e3f2fd,stroke:#3776ab,stroke-width:2px
    style G fill:#fff3e0,stroke:#f57c00,stroke-width:2px
    style I fill:#fce4ec,stroke:#c2185b,stroke-width:3px
Şekil 7.1: Ders 6’nın akış haritası — if’ten torch.where’e

Dersin beş parçası:

  1. if ifadesi.if hungry: eat().
  2. else ve elif. — Çoklu dal.
  3. Karşılaştırma operatörleri.==, !=, <, >, <=, >=.
  4. Mantık operatörleri.and, or, not.
  5. Better Calculator (proje).if/elif/else ile dispatch.
İpucuBuilder Notu — Bu Dersin ML Köprüleri
  • if/else = torch.where() masking. Mosh’un if x > 0: y = x else: y = 0 (ReLU mantığı!), PyTorch’ta y = torch.where(x > 0, x, torch.zeros_like(x)) ile birebir aynı iş. Element-wise çalıştığı için batch verisinde yüz binlerce karar tek hamlede.
  • Karşılaştırma = boolean mask. x > 0 Python’da skaler True/False; PyTorch’ta tensor > 0tensor of True/False (boolean mask). Bu mask ile filtreleme: x[x > 0] (pozitif elemanlar).
  • Boolean = mask tensor. ML’de “hangi token padding, hangi değil”, “hangi pixel arka plan” — hepsi True/False tensor’lar.
  • and/or/not = &, |, ~ tensor’larda. Python’da True and False boolean; PyTorch’ta mask1 & mask2 (element-wise AND). Multi-condition filtering ML’de kritik.
  • Multi-branch (elif) = argmax / bucketize. if score > 0.9: A elif score > 0.5: B else: C mantığı, softmax + threshold ile vektörlü.
  • Truthy/Falsy = empty check pattern. if liste: boş mu kontrolü Python’un en sevilen deyimi.
  • Short-circuit = lazy evaluation. if obj is not None and obj.value > 0: — güvenli null kontrol.
  • Sanity check disiplini. ML’de if loss.isnan(): raise RuntimeError(...) — üretim ML kodunun savunma mekanizması.

7.2 if İfadesi — Temel

Mosh:

“ifadeler programlarımıza gerçekten yardımcı olabiliriz. Yapmak kararlar.” — Mosh (Türkçe dublaj), 1:40:18

7.2.1 Günlük Hayattan Örnek

"if hungry: eat breakfast"
"if cloudy: bring umbrella ELSE: bring sunglasses"
"if meat: order steak elif pasta: order spaghetti ELSE: order salad"

Programcı yapısı tıpatıp aynı:

if ac:
    kahvalti_yap()

if bulutlu:
    semsiye_getir()
else:
    gunes_gozlugu_getir()

if etyemek:
    biftek_siparis()
elif makarna:
    spagetti_siparis()
else:
    salata_siparis()

7.2.2 Sentaks

“Eğer bir if ifadesi kullanmak istersem tek yapmam gereken yazmak if. ve sonra Sadece yazmam gerek bir durum.” — Mosh (Türkçe dublaj), 1:44:22

if kosul:
    # girintili kod (kosul True ise calisir)
    print("kosul dogru!")

Dört parça:

  • if — anahtar kelime.
  • koşulTrue veya False üreten bir ifade.
  • : — gövde başlangıcı.
  • girintili kod — koşul True olduğunda çalışan blok.

7.2.3 İlk Örnek

is_male = True

if is_male:
    print("Sen bir erkeksin.")

print("Bu satir her zaman calisir (girinti yok).")

is_male False yapılsa, if içindeki kod atlanır; gerisi normal çalışır.

7.2.4 Sanity Check Pattern

İpucuBuilder Notu — Üretim ML Kodu

ML’in en yaygın if pattern’i: sanity check + early termination.

import torch

def train_step(model, batch):
    loss = model(batch).loss

    if torch.isnan(loss):
        raise RuntimeError("Loss is NaN - training diverged!")

    if loss.item() > 1e6:
        print("Warning: loss is very large, check learning rate")

    return loss

Üç if — üç farklı sanity check. Üretim ML kodu bu pattern ile dolu. Mosh’un “if condition: act” temel yapısı, savunma mekanizması.

7.3 else ve elif — Çoklu Dallar

7.3.1 else

is_male = True

if is_male:
    print("Sen bir erkeksin.")
else:
    print("Sen bir erkek degilsin.")

Mutlaka biri çalışır.

7.3.2 elif

restoran_yemek = "makarna"

if restoran_yemek == "biftek":
    print("Biftek siparis edildi.")
elif restoran_yemek == "makarna":
    print("Spagetti ve kofte siparis edildi.")
elif restoran_yemek == "balik":
    print("Levrek siparis edildi.")
else:
    print("Salata siparis edildi.")

Akış:

  1. if kontrol → False → atla.
  2. İlk elif → True → bu bloğu çalıştır + tüm zinciri bitir.
  3. Diğerleri çalışmaz.

Tek bir blok çalışır — koşullar True olsa bile sadece ilki.

7.3.3 Pratik — Not Sistemi

puan = 87

if puan >= 90:
    harf = "A"
elif puan >= 80:
    harf = "B"
elif puan >= 70:
    harf = "C"
elif puan >= 60:
    harf = "D"
else:
    harf = "F"

İlk elif’in koşulu yazılırken 87 < 90 zaten biliniyor (önceki if False olduğu için buradayız). Bu yüzden sadece alt sınırı yazmak yeterli.

7.3.4 Multi-Branch ML’de

İpucuBuilder Notu — Confidence Dispatch
import torch

logits = model(x)
probs = torch.softmax(logits, dim=-1)
max_prob, pred_class = probs.max(dim=-1)

# Sklaer Python (yavaş):
for i in range(batch_size):
    if max_prob[i] > 0.9:
        action = "accept"
    elif max_prob[i] > 0.5:
        action = "review"
    elif max_prob[i] > 0.3:
        action = "human_review"
    else:
        action = "reject"

# Vektörlü PyTorch (hızlı):
actions = torch.zeros_like(max_prob, dtype=torch.long)
actions = torch.where(max_prob > 0.9, 0, actions)
actions = torch.where((max_prob > 0.5) & (max_prob <= 0.9), 1, actions)
actions = torch.where((max_prob > 0.3) & (max_prob <= 0.5), 2, actions)
actions = torch.where(max_prob <= 0.3, 3, actions)

torch.where Mosh’un if/elif/else zincirinin tensor-element-wise versiyonu. Tek hamlede tüm batch için karar verir.

7.4 Karşılaştırma Operatörleri

“ifadelerin kullanıp kullanılmadığını başka bir yolla inceleyeceğiz. Sadece boolean değerleri kullanmak yerine, aslında karşılaştırabiliriz.” — Mosh (Türkçe dublaj), 1:54:30

7.4.1 Altı Operatör

a = 5
b = 10

a == b   # False  (esit mi?)
a != b   # True   (esit DEGIL mi?)
a < b    # True   (kucuk mu?)
a > b    # False  (buyuk mu?)
a <= b   # True
a >= b   # False

Her karşılaştırma boolean döner.

7.4.2 KRİTİK Tuzak — = vs ==

a = 5        # ATAMA: a degiskenine 5 koy
a == 5       # KARSILASTIRMA: a 5'e esit mi? (True)

if a = 5:    # SyntaxError! atama if kosulu olamaz
    ...

if a == 5:   # OK
    ...

Python tasarımı bu hatayı erken yakalar (SyntaxError). C/Java’da if (a = 5) sessizce çalışır.

7.4.3 String Karşılaştırma

isim = "Deniz"

if isim == "Deniz":
    print("Selam Deniz!")

# Alfabetik:
"apple" < "banana"    # True   (a < b)
"apple" < "Apple"     # False  (A buyuk harf ASCII'de KUCUK)

# Case-insensitive:
if isim.lower() == "deniz":   # her ikisini küçük, sonra karsilastir
    print("Selam!")

7.4.4 Mosh’un Max Örneği

def max_num(num1, num2, num3):
    if num1 >= num2 and num1 >= num3:
        return num1
    elif num2 >= num1 and num2 >= num3:
        return num2
    else:
        return num3

print(max_num(3, 4, 5))      # 5
print(max_num(40, 4, 5))     # 40

7.4.5 Zincirleme — Python Özel

# C/Java tarzi:
if 0 < x and x < 10:
    print("0-10 arasinda")

# Python ozel - zincirleme:
if 0 < x < 10:
    print("0-10 arasinda")

# Matematik notasyonu:
if 18 <= yas < 65:
    print("Calisma yasinda")

C/Java/JS bu syntax’ı desteklemez.

7.4.6 Tensor Karşılaştırma

İpucuBuilder Notu — Boolean Mask

PyTorch’ta karşılaştırma operatörleri element-wise:

import torch

x = torch.tensor([1, 5, 3, 8, 2])
threshold = 4

mask = x > threshold
print(mask)             # tensor([False,  True, False,  True, False])
print(mask.dtype)       # torch.bool

# Mask ile filtreleme:
print(x[mask])          # tensor([5, 8])
print(mask.sum())       # tensor(2)  - kaç eleman threshold'u astı

Mosh’un if x > 4: skaler karşılaştırması, PyTorch’ta x > 4 ile tensor-of-booleans üretir. Bu mask ML’in temel veri yapısı:

  • Attention mask — hangi token’lara dikkat
  • Padding mask — hangi pozisyonlar boş
  • Image segmentation — hangi pixel obje
  • Loss masking — hangi sample’lar hesaba katılsın
Şekil 7.2: Mosh’un if/else’i = ReLU = torch.where(x>0, x, 0) — aynı mantık

7.5 Mantık Operatörleri — and, or, not

7.5.1 and — İkisi de Doğru

is_male = True
is_tall = True

if is_male and is_tall:
    print("Uzun boylu bir erkeksin.")

True and True = True; başka her şey = False.

7.5.2 or — En Az Biri Doğru

if is_male or is_tall:
    print("Erkek veya uzun (veya ikisi).")

False or False = False; başka her şey = True.

7.5.3 not — Tersine Çevir

if not is_male:
    print("Erkek degilsin.")

7.5.4 Birleştirme

is_male = True
is_tall = False

if is_male and is_tall:
    print("Uzun boylu erkek.")
elif is_male and not is_tall:
    print("Kisa boylu erkek.")
elif not is_male and is_tall:
    print("Uzun boylu (erkek degil).")
else:
    print("Ne erkek ne de uzun.")

7.5.5 Operatör Önceliği

# not > and > or
True or False and False    # = True or (False and False) = True
not True and False         # = (not True) and False = False

Şüphedeysen parantez koy.

7.5.6 Conditional Expression (Ternary)

yas = 25

# Cok satirli:
if yas >= 18:
    durum = "yetiskin"
else:
    durum = "cocuk"

# Tek satirli:
durum = "yetiskin" if yas >= 18 else "cocuk"

ML kodda yaygın:

# Learning rate schedule:
lr = 1e-3 if epoch < 10 else 1e-4

# Device:
device = "cuda" if torch.cuda.is_available() else "cpu"

7.5.7 Tensor’larda &, |, ~

UyarıBuilder Notu — Tensor Bitwise

PyTorch’ta and, or, not tensor-geneninde bitwise olarak:

import torch

mask1 = torch.tensor([True, False, True, True])
mask2 = torch.tensor([True, True, False, True])

mask1 & mask2    # tensor([ True, False, False,  True])  AND
mask1 | mask2    # tensor([ True,  True,  True,  True])  OR
~mask1           # tensor([False,  True, False, False])  NOT

Dikkat: and/or/not Python’un boolean operatörleri (skaler); &/|/~ bitwise (tensor). Karıştırma:

# YANLIS:
if mask1 and mask2:    # RuntimeError - hangi True/False?
    ...

# DOGRU:
combined = mask1 & mask2     # element-wise

# Skaler kontrol:
if mask1.all():   # tum elementler True mi?
    ...
if mask1.any():   # en az bir True mi?
    ...

ML pattern — attention masking:

padding_mask = (tokens == PAD_TOKEN)
causal_mask = torch.tril(torch.ones(seq_len, seq_len)).bool()

combined_mask = padding_mask | ~causal_mask

attention_scores.masked_fill_(combined_mask, float('-inf'))

Bu transformer attention’ın çekirdek mekanizması. GPT/BERT/Claude’un içinde tam olarak böyle kullanılır.

7.6 Truthy / Falsy

Python her objeyi bir boolean değere indirgeyebilir.

Falsy (False gibi):

  • False, None, 0, 0.0, "" (boş string)
  • [], (), {}, set() (boş koleksiyonlar)

Truthy (her şey):

  • True, sıfırdan farklı her sayı, boş olmayan her şey

7.6.1 Yaygın Pattern’lar

liste = []
if liste:
    print("Dolu")
else:
    print("Bos")           # bu çalışır

# Sayi sifir mi:
sayi = 0
if not sayi:
    print("Sifir veya hicbir sey")

# None kontrol (genelde `is None` daha iyi):
result = None
if result is None:
    print("Sonuc yok")

7.6.2 is None vs == None

# IYI:
if x is None:
    ...

# COGUNLUKLA OK ama özel durumlarda buggy:
if x == None:
    ...

is referans kıyası (aynı obje mi?); == değer kıyası. None singleton — sadece bir tane var.

7.6.3 ML’de Truthy/Falsy

if dataloader:                    # data var mi?
    for batch in dataloader:
        ...

if model is not None:
    model.eval()

if all_losses:                    # liste bos degilse
    avg = sum(all_losses) / len(all_losses)
else:
    avg = 0

if liste: empty kontrolü Python’un en sevilen deyimlerinden. C/Java’da if (list != null && list.size() > 0); Python: if liste:.

7.7 Proje — Better Calculator

Ders 3’te basit calculator (toplama). Şimdi dört işlem:

num1 = float(input("Birinci sayi: "))
op = input("Islem (+, -, *, /): ")
num2 = float(input("Ikinci sayi: "))

if op == "+":
    print(num1 + num2)
elif op == "-":
    print(num1 - num2)
elif op == "*":
    print(num1 * num2)
elif op == "/":
    print(num1 / num2)
else:
    print("Bilinmeyen islem!")

Çalıştır:

Birinci sayi: 7
Islem (+, -, *, /): *
Ikinci sayi: 3
21.0

7.7.1 İyileştirme — Sıfıra Bölme

elif op == "/":
    if num2 == 0:
        print("Hata: sifira bolunemez")
    else:
        print(num1 / num2)

7.7.2 ML Pattern — Model Seçimi

İpucuBuilder Notu — Factory Pattern
model_type = input("Model tipi (cnn/rnn/transformer): ")

if model_type == "cnn":
    model = build_cnn()
elif model_type == "rnn":
    model = build_rnn()
elif model_type == "transformer":
    model = build_transformer()
else:
    raise ValueError(f"Bilinmeyen: {model_type}")

model.train()

Mosh’un calculator’ı, ML’deki factory pattern ve configuration-driven model building’in mikro versiyonu. Hugging Face AutoModel.from_pretrained("bert-base-uncased") — içeride hangi mimari? bert ise BERT, gpt ise GPT — if/elif zinciri.

7.8 Bu Dersin Özeti

  1. if kosul: — koşul True ise blok çalışır.
  2. else — alternatif.
  3. elif — çoklu dal; ilk True kazanır.
  4. ==, !=, <, >, <=, >= — boolean döner.
  5. = vs == — atama vs karşılaştırma; karıştırma SyntaxError.
  6. Zincirleme 0 < x < 10 — Python özel.
  7. and, or, not — Python skaler.
  8. &, |, ~ — tensor için bitwise.
  9. Truthy/Falsyif liste: empty check.
  10. x if cond else y — tek satırlık conditional.
ÖnemliTek Bir Cümle

if/elif/else Python’a karar verme yetisi kazandırır — Mosh’un “if hungry: eat else: skip” mantığı, PyTorch’taki torch.where(x > 0, x, 0) (ReLU!) ve transformer’lardaki attention masking’in (padding_mask | ~causal_mask) çekirdek atasıdır; karşılaştırma operatörleri tensor için boolean mask üretir — ML’in temel veri yapısı; ve if liste: boş kontrolü Python’un okunabilirlik felsefesinin en güzel örneklerinden biridir.

7.9 Egzersizler

Egzersiz 1. Yaş kategorileri:

  • 0-2: “bebek”, 3-12: “cocuk”, 13-17: “genc”, 18-64: “yetiskin”, 65+: “yasli”.
yas = int(input("Yas: "))

if ???:
    print("bebek")
elif ???:
    ...

Sıra önemli — katıdan gevşeğe.

Egzersiz 2. Şifre güçlülük kontrolü (and):

sifre = input("Sifre: ")

uzun = len(sifre) >= 8
buyuk = any(c.isupper() for c in sifre)
rakam = any(c.isdigit() for c in sifre)

if uzun and buyuk and rakam:
    print("Sifre guclu!")
else:
    print("Eksik:")
    if not uzun: print("- En az 8 karakter")
    if not buyuk: print("- Buyuk harf")
    if not rakam: print("- Rakam")

Egzersiz 3. Calculator’a % ve ** ekle + sıfıra bölme kontrolü:

num1 = float(input("Birinci sayi: "))
op = input("Islem (+, -, *, /, %, **): ")
num2 = float(input("Ikinci sayi: "))

if op == "+":
    sonuc = num1 + num2
elif ???:
    ...

Egzersiz 4. Truthy/Falsy tahmin et:

test = [0, 0.0, "", " ", [], [0], None, "False"]

for x in test:
    if x:
        print(f"{x!r} → TRUTHY")
    else:
        print(f"{x!r} → FALSY")

"False" (string) neden truthy? [0] neden truthy?

Egzersiz 5. (Builder eksen — tensor mask) torch.where mantığını Python listesi ile simüle et:

skorlar = [0.95, 0.42, 0.78, 0.31, 0.88, 0.55, 0.12, 0.99, 0.45, 0.67]

def aksiyon_belirle(skor):
    if ???:           # > 0.9 → "accept"
        return "accept"
    elif ???:         # > 0.5 → "review"
        return "review"
    else:
        return "reject"

aksiyonlar = [aksiyon_belirle(s) for s in skorlar]

for s, a in zip(skorlar, aksiyonlar):
    print(f"Skor {s:.2f}{a}")

print(f"\nAccept: {aksiyonlar.count('accept')}")
print(f"Review: {aksiyonlar.count('review')}")
print(f"Reject: {aksiyonlar.count('reject')}")

Bu egzersiz, ML’de tensor üzerinde vektörlü olarak yapılan kararın Python liste üzerinde döngülü versiyonu.

7.10 Sonraki Ders İçin Hazırlık

Ders 7: Sözlükler ve Setler

Mosh’un Ch 19 (Dictionaries) + Set kavramı (Mosh göstermez ama Python ekosistemi şart). Liste sıralı koleksiyondu; dict anahtar-değer eşlemesi, set unique elemanlar.

  • Mosh’un Ch 19’unu izle (2:07:20 - 2:14:16, ~7 dk).
  • Şu cümleyi içselleştir: “Dict = anahtarla bulma; Set = unique elemanlar.”
İpucuBu dersten tek bir şey alıp gideceksen

if/elif/else Python’a karar verme yetisi kazandırır — Mosh’un “if hungry: eat else: skip” mantığı, modern ML’in en derin yapı taşıdır: PyTorch’un torch.where(x > 0, x, 0) (ReLU!), transformer attention masking (padding_mask | ~causal_mask), tüm sanity check’ler (if loss.isnan(): raise), tüm conditional schedule’lar (lr = 1e-3 if epoch < 10 else 1e-4) — hepsi bu temel mantığın doğal uzantısı.