flowchart LR
A["Çevirmen projesi"] --> B["for letter in phrase"]
B --> C["if letter in 'aeiou'"]
C --> D["💡 NLP preprocessing"]
D --> E["lowercase + tokenize"]
F["# yorum"] --> G["why over what"]
G --> H["Self-documenting code"]
H --> I["💎 ML pipeline docs"]
style D fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style I fill:#fce4ec,stroke:#c2185b,stroke-width:3px
10 Uygulama: Çevirmen ve İyi Yorum Alışkanlığı
String transform + # yorum — NLP preprocessing ve ML documentation
- Mosh’un videosu: Chapters 25-26 (Translator → Comments) (≈12 dk)
- Bölüm aralığı: 2:52:44 — 3:04:23
- Kaynaklar: PEP 8 — comments · PEP 257 — docstrings
- Okuma süresi: ≈30 dk
10.1 Bu Derste Ne Var?
Şu ana kadar öğrendiğimiz tüm yapıları (değişken, fonksiyon, if, for) bir araya getirip uygulama yazma alıştırması yapacağız. Ayrıca programlama disiplininin görünmez ama kritik bir parçasını öğreneceğiz: iyi yorum yazma alışkanlığı.
Dersin iki parçası:
- Çevirmen projesi (Mosh Ch 25). — “Draft dili”ne çeviren küçük program. Ders 4-5-6-8’in sentezi.
- Yorumlar (Mosh Ch 26). —
#ile yazılan, insanın okuması için kritik satırlar.
- Çevirmen = preprocessing pipeline. Karakter karakter dönüşüm = string normalization (lowercase, accent stripping), NLP’nin temeli.
for letter in phrase= tokenize/character-level encoding. Modern transformer’lardafor token in tokens:ile eşleşir. Mosh’un karakter döngüsü, GPT’nin BPE’sinin ilkel formu.- String transformation = data cleaning. ML pipeline’ının %30’u veri temizleme: lowercase, punctuation removal, whitespace normalization.
- Yorum = ML pipeline documentation. Sinir ağı kodu yalnız bakıldığında anlaşılmaz: “neden 512 dim?”, “neden bu loss?”, “neden bu augmentation?”.
- Docstring = API documentation (PyTorch, NumPy).
help(torch.nn.Linear)yüzlerce satırlık docs açar. - “Why over what” prensibi. İyi yorum koda ne yaptığını değil, neden yaptığını açıklar.
- Magic number = yorum gereksinimi.
lr = 1e-3yalnız görülürse “neden 1e-3?” sorusu kalır. - Self-documenting code prensibi. En iyi yorum yorumsuz kod’tur.
10.2 Çevirmen Projesi
Mosh kuruyor:
“tercüman nasıl kurulacağını göstereceğim piton. yani esasen yapabiliriz içeri almak onu bir cümle veya kelime gibi götürebiliriz ve onu farklı bir dile çevirebileceklerdir.” — Mosh (Türkçe dublaj), 2:52:44
10.2.1 Draft Language
“Draft Language” Mosh’un uydurduğu dil:
- Tüm ünlüleri (
a,e,i,o,u)gile değiştir. - Sessiz harfler aynen kalsın.
Örnekler:
dog→dggcat→cgtpython→pythgn
10.2.2 İlk Versiyon
def translate(phrase):
translation = ""
for letter in phrase:
if letter in "aeiouAEIOU":
translation = translation + "g"
else:
translation = translation + letter
return translation
print(translate(input("Bir cumle gir: ")))Çalıştır:
Bir cumle gir: To be or not to be
Tg bg gr ngt tg bg
10.2.3 Mantığın Analizi
| Satır | Ders | Konsept |
|---|---|---|
def translate(phrase): |
5 | Fonksiyon tanımı |
translation = "" |
4 | Akumulator (boş başla) |
for letter in phrase: |
8 | String iteration |
if letter in "aeiouAEIOU": |
6 + 7 | Membership test |
translation += "g" |
2 | String concat |
return translation |
5 | Değer döndürme |
Bu mikro program Ders 4-5-6-8’in pratik sentezi.
10.2.4 İyileştirme — .lower() ile Verimli
“Aslında sadece soyleyebilirim ki mektup nokta alt icinde ve simdi sadece kucuk harfleri yazmam gerekiyor.” — Mosh (Türkçe dublaj), 2:58:32
def translate(phrase):
translation = ""
for letter in phrase:
if letter.lower() in "aeiou": # case-insensitive
translation += "g"
else:
translation += letter
return translation10.2.5 İyileştirme — Büyük/Küçük Harf Koruma
Şu an "To" → "Tg". Asimetri:
def translate(phrase):
translation = ""
for letter in phrase:
if letter.lower() in "aeiou":
if letter.isupper():
translation += "G"
else:
translation += "g"
else:
translation += letter
return translation
print(translate("To Be Or Not To Be"))
# Tg Bg Gr Ngt Tg Bg10.2.6 Modern Versiyon — join + Conditional Expression
def translate(phrase):
"""Bir cumleyi Draft diline cevirir (ünlüler G/g olur)."""
sesli = "aeiou"
parcalar = []
for harf in phrase:
if harf.lower() in sesli:
yeni = "G" if harf.isupper() else "g"
else:
yeni = harf
parcalar.append(yeni)
return "".join(parcalar)list + .join()yerine string concat — büyük metinlerde daha hızlı.- Conditional expression (
"G" if ... else "g") — Ders 6. - Docstring (
"""...""") — Ders 5.
10.2.7 Tek Satır — List Comprehension
def translate(phrase):
return "".join(
("G" if h.isupper() else "g") if h.lower() in "aeiou" else h
for h in phrase
)Bir satırda her şey. Pratik öneri: 2-3 koşul iç içe OK, daha fazlasıysa açık for.
10.2.8 Çevirmen = Preprocessing
def clean_text(text):
"""Bir metni ML-ready hale getir."""
# 1. Lowercase
text = text.lower()
# 2. Punctuation strip
import string
text = "".join(c for c in text if c not in string.punctuation)
# 3. Whitespace normalize
text = " ".join(text.split())
return text
raw = "Hello WORLD!!! Today is 2026..."
cleaned = clean_text(raw)
print(cleaned)
# hello world today is 2026Mosh’un draft language çevirmeni, bu ML preprocessing pipeline’ının ilkel formu.
Tokenization — bir adım sonra:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer.tokenize("Hello world!")
print(tokens) # ['hello', 'world', '!']
ids = tokenizer.encode("Hello world!")
print(ids) # [101, 7592, 2088, 999, 102]Mosh’un for letter in phrase’ı, transformer’larda for token in tokens’a evrilir.
10.3 Yorumlar — # ile İnsan-Okunabilirlik
Mosh Ch 26 kısa ama temel bir kavramı işliyor:
“bir yorum […] python tarafından işlenmeyecek olan bir çizgidir.” — Mosh (Türkçe dublaj), 3:00:47
10.3.1 Sentaks
# Bu bir yorum. Python bunu çalıştırmaz.
x = 5 # Satır içi yorum: x'i 5 yap.İki form:
- Tam satır yorum —
#ile başlar. - Satır-içi yorum — kod sonrasında
#.
10.3.2 Python Yorum Yok Sayar
# print("bu basilmaz")
print("bu basilir") # Yorum kismi degil, bu kod basilir“Temelde sadece insanlar için kullanılır. bu yüzden benim veya başka bir geliştiricinin beğenisine küçük bir yorum yazın” — Mosh (Türkçe dublaj), 3:01:09
10.3.3 Çoklu Satır
# Yontem 1: Her satiri # ile baslat (PEP 8 önerisi)
# Bu bir uzun
# açıklama.
"""
Yontem 2: Triple-quoted string.
Etkisiz (atanmamış).
"""10.3.4 Docstring vs Comment
def translate(phrase):
"""Cevirmen — bir cumleyi Draft diline cevirir.
Args:
phrase: Cevirilecek string.
Returns:
Cevirilmis string.
"""
# Akumulator: gezerken doldurulacak
translation = ""
# Her karakter icin kontrol
for letter in phrase:
...
return translation- Docstring (
"""...""") — fonksiyon başında.help(...)ile görünür. Resmi. - Comment (
#) — kod akışında. Geçici/açıklayıcı.
Pratik kural: Fonksiyon imzaları → docstring. Kod akışındaki kararlar/uyarılar → #.
10.4 İyi Yorum Alışkanlığı
10.4.1 “Why Over What” Prensibi
Kötü yorum — kod tekrarı:
# x'i 5 yap
x = 5
# i'yi 1 artir
i += 1
# Loss'u backward yap
loss.backward()Değersiz. Kod zaten söylüyor.
İyi yorum — gerekçe:
# Magic number: Paper X'te kanıtlanan optimal hyperparameter
LEARNING_RATE = 3e-4
# Onceki epoch'tan kalan gradient'leri sifirla
# (PyTorch otomatik clear etmez - bilincli tasarim)
optimizer.zero_grad()
# Augmentation: %50 ihtimalle horizontal flip
# Gerekce: ImageNet'te 1% accuracy boost (validation)
if random.random() < 0.5:
image = transforms.functional.hflip(image)Bunlar değer katıyor — “neden bu sayı? Kaynak nerede?” sorularını yanıtlıyor.
10.4.2 Self-Documenting Code
# KOTU - yorum kodu kompanse:
x = 0 # epoch sayisi
y = 100 # max epoch
for i in range(y):
z = train(model, data) # z = train loss
# IYI - kod kendi acikliyor:
epoch_count = 0
MAX_EPOCHS = 100
for epoch_idx in range(MAX_EPOCHS):
train_loss = train(model, data)
epoch_count += 1İyi isimlendirme = yorum gereksizliği.
10.4.3 Yorum Tehlikeleri
1. Yanlış / Eski Yorum:
# learning rate 1e-3 (KOD DEĞIŞTI, YORUM KALMADI)
LEARNING_RATE = 5e-4Eski yorum yorumsuz koddan daha kötü — okuyucuyu yanıltır.
2. Aşırı Yorum:
i = 0 # i'yi sifirla
i += 1 # i'yi bir artir
i *= 2 # i'yi iki ile carpGörsel akışı bozar.
3. Şaka / Sızlanma:
# Burayi düzenleyene lanet olsun
# Bu fonksiyon calisiyor ama nasil bilmiyorumProfesyonel kodda yer almaz. TODO’lar issue tracker’a.
10.4.4 İyi Yorum Pattern’ları
Pattern 1 — Block başlığı:
# ===== Hyperparameters =====
LEARNING_RATE = 1e-3
BATCH_SIZE = 64
# ===== Model =====
model = MyModel()
# ===== Training =====
for epoch in range(EPOCHS):
...Pattern 2 — Algoritma açıklaması:
def find_lr(model, loader):
"""Learning rate finder (Smith 2018)."""
# Adim 1: LR'yi exponential olarak artir
lr_schedule = [1e-7 * 10**i for i in range(50)]
# Adim 2: Her LR icin bir batch egit
losses = []
for lr in lr_schedule:
...
# Adim 3: Loss vs LR plotunda dik dustugu noktayi sec
return lr_schedule[find_steepest_drop(losses)]Pattern 3 — Uyarı:
# UYARI: Bu fonksiyon model.train() modunu cagirmaz
# Cagiran kod sorumlu (genelde validation kodu disarida)
def evaluate(model, loader):
...Pattern 4 — Referans:
# Reference: Attention is All You Need (Vaswani 2017)
# Section 3.2.1, Eq. (1)
def scaled_dot_product_attention(Q, K, V):
d_k = Q.shape[-1]
scores = Q @ K.transpose(-2, -1) / (d_k ** 0.5)
attn = scores.softmax(dim=-1)
return attn @ VML araştırma kodunda paper referansı kritik.
10.4.5 ML Pipeline Documentation Hiyerarşisi
"""
training.py — Görsel sınıflandırma modeli eğitim scripti.
Yazar: Deniz
Tarih: 2026-05-28
Referans: ResNet paper (He et al. 2015)
"""
import torch
# Kaynak: configs/resnet18.yaml
config = load_config("configs/resnet18.yaml")
def train_one_epoch(model, loader, optimizer, criterion):
"""Tek bir epoch'un eğitim adımı.
Args:
model: PyTorch modeli (nn.Module).
loader: DataLoader, batch'leri dict olarak yield eder.
optimizer: AdamW veya benzeri.
criterion: Loss fonksiyonu.
Returns:
avg_loss: Epoch'un ortalama loss'u.
"""
model.train()
losses = []
for batch_idx, batch in enumerate(loader):
# Veri device'a taşı
images = batch["image"].to(DEVICE)
labels = batch["label"].to(DEVICE)
# Forward + loss
logits = model(images)
loss = criterion(logits, labels)
# NaN guard - bozuk batch'i atla
if torch.isnan(loss):
continue
# Gradient clipping (paper sec 3.4)
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.zero_grad()
loss.backward()
optimizer.step()
losses.append(loss.item())
return sum(losses) / len(losses)Üç katman:
- Module docstring — dosya seviyesinde.
- Function docstring — her fonksiyon başında.
- Inline comments — kritik karar noktalarında.
10.5 Bu Dersin Özeti
- Çevirmen projesi — string transform pipeline’ı, Ders 4-5-6-8 sentezi.
- Yorumlar (
#) — Python yok sayar, insan okur. - İyi yorum: “why over what”.
- Self-documenting code — iyi isimlendirme yorum azaltır.
- Docstring vs comment — fonksiyon imzaları docstring, akış yorumları
#. - Magic number = yorum gereksinimi.
- ML pipeline doc: module → function → inline hiyerarşisi.
Mosh’un for letter in phrase: if letter in "aeiou": translation += "g" mikro programı, modern ML preprocessing pipeline’ının (lowercase, punctuation strip, tokenize) ve transformer karakter-bazlı encoding’in birebir atasıdır; yorumlar (#) Python tarafından yok sayılır ama kodun neden öyle yazıldığını insanlara taşır — magic number’lar, paper referansları, algoritma adımları; iyi yorum “ne yapar” demek değil “neden yapar” demektir, ve en iyi yorum gereksiz yorumdur (self-documenting code).
10.6 Egzersizler
Egzersiz 1. Türkçe ünlüler için çevirmen — a, e, ı, i, o, ö, u, ü:
def translate_turkce(phrase):
"""Bir Turkce cumleyi Draft diline cevirir."""
turkce_unluler = "aeıioöuü"
translation = ""
for letter in phrase:
if letter.lower() in turkce_unluler:
translation += "G" if letter.isupper() else "g"
else:
translation += letter
return translation
print(translate_turkce("Çok güzel bir gün"))
# Çgk ggzgl bgr ggnEgzersiz 2. Sesli harf sayısı:
def count_vowels(phrase):
count = 0
???
return count
print(count_vowels("Hello World")) # 3
print(count_vowels("AEIOU")) # 5Egzersiz 3. Yorumsuz kodu iyi yorumlarla zenginleştir:
import torch
import torch.nn as nn
config = {"lr": 3e-4, "batch_size": 32, "epochs": 50}
model = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(256, 10),
)
optimizer = torch.optim.AdamW(model.parameters(), lr=config["lr"])
criterion = nn.CrossEntropyLoss()
for epoch in range(config["epochs"]):
for batch in train_loader:
x, y = batch
logits = model(x)
loss = criterion(logits, y)
optimizer.zero_grad()
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
optimizer.step()Konular: 3e-4 (Karpathy tweet?), 0.2 dropout, AdamW vs Adam, gradient clip 1.0.
Egzersiz 4. Sezar şifresi:
def caesar(phrase, shift):
"""Sezar sifresi — her harfi shift kadar kaydir."""
result = ""
for letter in phrase:
if letter.isalpha():
base = ord("A") if letter.isupper() else ord("a")
offset = (ord(letter) - base + shift) % 26
result += chr(base + offset)
else:
result += letter
return result
print(caesar("Hello World", 3)) # Khoor Zruog
print(caesar("Khoor Zruog", -3)) # Hello Worldord() ve chr() — karakter ↔︎ ASCII sayı.
Egzersiz 5. (Builder eksen — NLP preprocessing)
def preprocess_text(text):
"""ML-ready hale getir.
Adimlar:
1. Lowercase
2. Punctuation strip
3. Whitespace normalize
4. Strip start/end
"""
import string
# 1. Lowercase
text = text.lower()
# 2. Punctuation
text = "".join(c for c in text if c not in string.punctuation)
# 3. Whitespace
text = " ".join(text.split())
# 4. Strip
text = text.strip()
return text
raw = "Hello, World!!! Today is 2026... great day."
clean = preprocess_text(raw)
print(clean)
# "hello world today is 2026 great day"NLP pipeline’larında kritik fonksiyon.
10.7 Sonraki Ders İçin Hazırlık
Ders 10: Hata Yönetimi ve Dosyalar
Mosh’un Ch 27-29 (Try/Except, Reading Files, Writing Files). Programlarımız artık dış dünyaya dokunacak.
- Mosh’un Ch 27-29’unu izle (3:04:23-3:28:16, ~24 dk).
- Şu cümleyi içselleştir: “Hata olabilir, dosya olabilir veya olmayabilir — program bu belirsizlikle başa çıkmalı.”
Mosh’un çevirmeni — for letter in phrase: if letter in "aeiou": translation += "g" — modern ML preprocessing pipeline’ının (NLP tokenization, character encoding, BPE) çekirdek pattern’ıdır; yorumlar (#) Python’ın çalıştırmadığı ama insanın okuması gereken kritik bilgi taşıyıcılarıdır; en iyi yorum gereksiz yorumdur (self-documenting code), ama gerektiğinde “ne” değil “neden” yazılır.