10  Uygulama: Çevirmen ve İyi Yorum Alışkanlığı

String transform + # yorum — NLP preprocessing ve ML documentation

NotBölüm bilgisi

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ığı.

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
Şekil 10.1: Ders 9’un akış haritası — çevirmen ve yorum disiplini

Dersin iki parçası:

  1. Çevirmen projesi (Mosh Ch 25). — “Draft dili”ne çeviren küçük program. Ders 4-5-6-8’in sentezi.
  2. Yorumlar (Mosh Ch 26).# ile yazılan, insanın okuması için kritik satırlar.
İpucuBuilder Notu — Bu Dersin ML Köprüleri
  • Ç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’larda for 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-3 yalnı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:

  1. Tüm ünlüleri (a, e, i, o, u) g ile değiştir.
  2. Sessiz harfler aynen kalsın.

Örnekler:

  • dogdgg
  • catcgt
  • pythonpythgn

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 translation

10.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 Bg

10.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

İpucuBuilder Notu — NLP Pipeline
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 2026

Mosh’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

UyarıÜç tehlike

1. Yanlış / Eski Yorum:

# learning rate 1e-3 (KOD DEĞIŞTI, YORUM KALMADI)
LEARNING_RATE = 5e-4

Eski 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 carp

Görsel akışı bozar.

3. Şaka / Sızlanma:

# Burayi düzenleyene lanet olsun
# Bu fonksiyon calisiyor ama nasil bilmiyorum

Profesyonel 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 @ V

ML araştırma kodunda paper referansı kritik.

10.4.5 ML Pipeline Documentation Hiyerarşisi

İpucuBuilder Notu — Üç Katmanlı Disiplin
"""
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:

  1. Module docstring — dosya seviyesinde.
  2. Function docstring — her fonksiyon başında.
  3. Inline comments — kritik karar noktalarında.

10.5 Bu Dersin Özeti

  1. Çevirmen projesi — string transform pipeline’ı, Ders 4-5-6-8 sentezi.
  2. Yorumlar (#) — Python yok sayar, insan okur.
  3. İyi yorum: “why over what”.
  4. Self-documenting code — iyi isimlendirme yorum azaltır.
  5. Docstring vs comment — fonksiyon imzaları docstring, akış yorumları #.
  6. Magic number = yorum gereksinimi.
  7. ML pipeline doc: module → function → inline hiyerarşisi.
ÖnemliTek Bir Cümle

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 ggn

Egzersiz 2. Sesli harf sayısı:

def count_vowels(phrase):
    count = 0
    ???
    return count

print(count_vowels("Hello World"))   # 3
print(count_vowels("AEIOU"))          # 5

Egzersiz 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 World

ord() 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ı.”
İpucuBu dersten tek bir şey alıp gideceksen

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.