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
7 Karar Yapıları
if/elif/else + comparison + logic — torch.where ve attention masking’in atası
- Mosh’un videosu: Chapters 16-18 (If → Comparisons → Better Calculator) (≈27 dk)
- Bölüm aralığı: 1:40:09 — 2:07:20
- Kaynaklar: Python docs — control flow · PEP 308 — conditional expressions
- Okuma süresi: ≈50 dk
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.
Dersin beş parçası:
ififadesi. —if hungry: eat().elseveelif. — Çoklu dal.- Karşılaştırma operatörleri. —
==,!=,<,>,<=,>=. - Mantık operatörleri. —
and,or,not. - Better Calculator (proje). —
if/elif/elseile dispatch.
if/else=torch.where()masking. Mosh’unif x > 0: y = x else: y = 0(ReLU mantığı!), PyTorch’tay = 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 > 0Python’da skaler True/False; PyTorch’tatensor > 0→ tensor 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/Falsetensor’lar. and/or/not=&,|,~tensor’larda. Python’daTrue and Falseboolean; PyTorch’tamask1 & 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: Cmantığı, 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şul —
TrueveyaFalseüreten bir ifade. :— gövde başlangıcı.- girintili kod — koşul
Trueolduğ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
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ış:
ifkontrol → False → atla.- İlk
elif→ True → bu bloğu çalıştır + tüm zinciri bitir. - 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
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 # FalseHer 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)) # 407.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
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
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 &, |, ~
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]) NOTDikkat: 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 = 0if 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
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
if kosul:— koşul True ise blok çalışır.else— alternatif.elif— çoklu dal; ilk True kazanır.==,!=,<,>,<=,>=— boolean döner.=vs==— atama vs karşılaştırma; karıştırma SyntaxError.- Zincirleme
0 < x < 10— Python özel. and,or,not— Python skaler.&,|,~— tensor için bitwise.- Truthy/Falsy —
if liste:empty check. x if cond else y— tek satırlık conditional.
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.”
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ı.