3  Değişkenler ve Veri Tipleri

str, int, float — Python’un ana sözlüğü

NotBölüm bilgisi

3.1 Bu Derste Ne Var?

Ders 1’de print("Hello World") ile ekrana sabit metin bastık. Ama gerçek programlar sabitlerle değil, değişen verilerle çalışır — kullanıcının adı, bir dosyanın boyutu, bir modelin loss değeri. Bu dersin görevi: veriyi nasıl saklarız, etiketleriz, işleriz.

flowchart LR
    A["📦 Değişken"] --> B["3 Tip:<br/>str / int / float"]
    B --> C["String araçları"]
    B --> D["Sayı aritmetiği"]
    C --> E["Tip dönüşümü"]
    D --> E
    E --> F["from math import *"]
    F --> G["💡 İlk import"]
    G --> H["➡️ ML kütüphane evreni"]

    style A fill:#e3f2fd,stroke:#3776ab,stroke-width:2px
    style G fill:#fff3e0,stroke:#f57c00,stroke-width:2px
    style H fill:#fce4ec,stroke:#c2185b,stroke-width:3px
Şekil 3.1: Ders 2’nin akış haritası — değişkenden math modülüne

Dersin beş parçası:

  1. Neden değişken? — Mosh’un hikaye motivasyonu: bir karakterin adını elle 50 yerde değiştirme derdi.
  2. Atama syntax’ı.ad = "Deniz". Etiket-kutu zihinsel modeli.
  3. String’lerle çalışma. — Escape (\n, \"), birleştirme (+), methodlar (.upper, .lower, .replace, .index), indexing (s[0]), len().
  4. Sayılarla çalışma. — Integer, float, dört işlem, modulus (%), parantezle sıra.
  5. Tip dönüşümü + math modülü.str(), int(), float(); from math import *. İlk import!
İpucuBuilder Notu — Bu Dersin ML Köprüleri
  • Değişken = etiketli kutu = tensor referansı. x = torch.randn(10) yazarsan x bir 10-boyutlu rastgele tensor’a etiket asar. Mosh’un character_name = "John"’ı zihinsel olarak aynı işlem.
  • snake_case = Python standardı (PEP 8). PyTorch’ta learning_rate, batch_size, hidden_dim — hepsi snake_case. CamelCase sadece sınıflar için (Ders 12).
  • Dynamic typing = Python tip’i runtime’da öğrenir. Esneklik avantaj; büyük ML kodlarında type hints (x: torch.Tensor) ile dokümente edilir (PEP 484).
  • String indexing 0-based. Mosh phrase[0] ilk karakter; numpy/PyTorch tensor indexing’iyle birebir aynı: x[0].
  • String method’ları = pandas Series.str ailesi. phrase.upper() skalar; df["name"].str.upper() milyonlarca satırda. Aynı API, vektorlanmış.
  • Aritmetik = element-wise tensor op’ları. 3 + 4 skalar; tensor([1,2]) + tensor([3,4]) = [4, 6] element-wise. Aynı sembol, broadcasting ile genişletilmiş.
  • Tip dönüşümü = ML preprocessing. int("42") Mosh’un örneği; pandas’ta df["age"].astype(int) aynı işlem.
  • from math import * = ilk kütüphane evreni. Mosh ilk kez import gösteriyor. Bu satır → Ders 11’de göreceği pip install numpyimport numpy as np’ın ilkel hali.

3.2 Neden Değişken? — Mosh’un Hikaye Motivasyonu

Bu bölüm, Mosh’un en pedagojik anlatımlarından biri. Soyut bir tanımla başlamıyor; somut bir dert ile başlıyor: adı 50 yerde elle değiştirmek.

3.2.1 Hikaye Programı

Mosh dört satırlık bir program yazıyor:

print("Bir zamanlar george adinda bir adam vardi.")
print("O yetmis yasindaydi.")
print("George adini gercekten cok sevdi.")
print("Ama yetmis olmaktan hoslanmadi.")

Problem: karakterin adını değiştirmek. Mesela George’u John’a çevirelim. ne yapacağız?

“buraya gitmiyorum ve söyleyeceğim tamam john bunu elle değiştirmek zorunda kalacağım” — Mosh (Türkçe dublaj), 16:59

Dublaj kırık ama anlam net: George’un geçtiği her satırı aç, elle değiştir. Dört satırda iki kez geçiyor — iki manuel düzeltme.

3.2.2 “Ya hikaye bin satır olsaydı?”

Mosh:

“bir değişken kullanabiliriz saklamak için karakterin adı ve karakterlerin yaşı. ve bu değişkeni kullandığımız zaman onu çok değiştirecek.” — Mosh (Türkçe dublaj), 18:18

Çözüm:

character_name = "George"
character_age = 70

print("Bir zamanlar " + character_name + " adinda bir adam vardi.")
print("O " + str(character_age) + " yasindaydi.")
print(character_name + " adini gercekten cok sevdi.")
print("Ama yetmis olmaktan hoslanmadi.")

Karakter adı “John” yapılacaksa:

character_name = "John"   # tek değiştirme

Tüm program otomatik güncellenir.

İpucuBuilder Notu — Single Source of Truth

Bu, tek-noktada-değişim (single source of truth) prensibinin ilk görünüşü. ML kodunda her gün karşılaşacaksın:

# Kötü:
model = nn.Linear(784, 128)
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
for epoch in range(100):
    ...  # 0.001 dört yerde tekrar ediyor olsaydı...

# İyi:
LEARNING_RATE = 0.001
BATCH_SIZE = 64
HIDDEN_DIM = 128

model = nn.Linear(784, HIDDEN_DIM)
optimizer = torch.optim.SGD(model.parameters(), lr=LEARNING_RATE)

LEARNING_RATE bir kez tanımlanır; 50 satırlık bir modelde beş-on yerde kullanılır. Değiştirmek istediğinde tek bir noktayı değiştirirsin — Mosh’un “karakter adı”yla aynı mantık.

3.3 Atama Syntax’ı

ad = "Deniz"

Üç parça:

  • Sol taraf (ad) — değişkenin adı.
  • = — atama operatörü. Matematik “eşittir” değil; “ata, sakla” anlamında.
  • Sağ taraf ("Deniz") — değişkene konacak değer.

3.3.1 İsimlendirme — snake_case (PEP 8)

“farklı kelimeleri ayırmak istiyorsun bir alt çizgi ile” — Mosh (Türkçe dublaj), 19:14

Zorunlu (Python yorumlayıcısı reddeder):

  • Harf veya _ ile başla; rakamla başlama (5x → SyntaxError, x5 → OK).
  • Boşluk yok (first name → SyntaxError, first_name → OK).
  • Anahtar kelime kullanma (if, for, class, def, print, lambda → reserved).

Sözleşme (PEP 8):

Tür Stil Örnek
Değişken / Fonksiyon snake_case character_name, learning_rate
Sabit UPPER_SNAKE MAX_EPOCHS, PI
Sınıf (Ders 12) PascalCase NeuralNetwork, BertModel
Tek harf OK (sadece kısa scope) i, n, x

3.3.2 Üç Veri Tipi

ad = "Deniz"        # string  → tip(ad) → str
yas = 35            # integer → tip(yas) → int
boy = 1.78          # float   → tip(boy) → float

Python’da tip beyan etmiyorsun — sadece atama yap, Python tipini otomatik çıkarır (dynamic typing).

  • string (str) — tırnak içinde metin. Karakterler dizisi.
  • integer (int) — tam sayı. Python int sınırsız büyüyebilir.
  • float — ondalıklı sayı. IEEE 754 64-bit hassasiyet.

Dördüncü temel tip boolean (bool)True / False. Ders 6’da gelecek.

3.4 String’lerle Çalışma

Ch 6 (Working With Strings) Ders 2’nin en uzun bölümü (~11 dk).

3.4.1 String Yaratma

print("Draft Academy")          # cift tirnak
print('Draft Academy')          # tek tirnak - ayni sonuc

phrase = "Draft Academy"        # degiskene atadik
print(phrase)                   # Draft Academy

3.4.2 Escape Karakterleri — \n, \", \\

İçinde tırnak olan bir string nasıl yazılır? Birden fazla satıra yayılan bir metin?

print("Ilk satir\nIkinci satir")
Ilk satir
Ikinci satir

“buraya gelebilseydim, ve ters egik cizgi kurtarabilirim n… dizgeye yeni bir satir ekleyecegi” — Mosh (Türkçe dublaj), 28:12

(Dublajda “kurtarabilirim” = “kullanabilirim”. \n = backslash + n.)

print("Mosh dedi: \"piton harika\"")   # Mosh dedi: "piton harika"
print("C:\\Users\\deniz")              # C:\Users\deniz
İpucuBuilder Notu — Escape’lerin ML Eki

ML’de en sık görülen escape: path string’leri Windows yolları.

# Tehlikeli (Windows'ta yanlis okunur):
path = "C:\Users\deniz\data\train.csv"   # \U, \d, \t = escape karmasasi

# Guvenli:
path = r"C:\Users\deniz\data\train.csv"  # r"..." = raw string, hic escape yok
path = "C:/Users/deniz/data/train.csv"   # forward slash - tum platformlarda

r"..." (raw string) ML kodunda regex pattern’ları ve dosya yolları için yaygın. pathlib.Path("C:/...") modern alternatif.

3.4.3 Birleştirme — + ve f-string

ad = "Deniz"
selamlama = "Merhaba " + ad + ", hos geldin!"
print(selamlama)
# Merhaba Deniz, hos geldin!

Modern (Python 3.6+) — f-string:

ad = "Deniz"
yas = 35
print(f"Merhaba {ad}, sen {yas} yasindasin!")
# Merhaba Deniz, sen 35 yasindasin!

Mosh f-string’i göstermez ama 2026’da yazdığın her satırda standardın.

3.4.4 String Methodları

phrase = "Draft Academy"

phrase.lower()         # 'draft academy'
phrase.upper()         # 'DRAFT ACADEMY'
phrase.isupper()       # False
phrase.upper().isupper()  # True - method chaining
phrase.replace("Draft", "Elephant")  # 'Elephant Academy'
len(phrase)            # 13
İpucuBuilder Notu — pandas Series.str

pandas’ın Series.str ailesi Mosh’un öğrettiklerinin vektorlanmış hâli:

import pandas as pd

s = pd.Series(["Draft Academy", "Mosh Hamedani", "Python ROCKS"])

s.str.lower()                       # 3 satirin hepsi kucuk
s.str.upper().str.contains("PYTHON")  # 3 boolean
s.str.replace("Python", "Java")
s.str.len()

Aynı .upper(), aynı .replace(), aynı .len — sadece milyonlarca satırda. Mosh’un öğrettiği API direkt pandas’a aktarılıyor.

3.4.5 Indexing — s[0], Sıfır-Tabanlı

“Bir dizgede indeksler kullandigimiz zaman sifir ile basliyoruz” — Mosh (Türkçe dublaj), 34:11

phrase = "Draft Academy"

phrase[0]      # 'D'  (0. karakter = İLK karakter)
phrase[1]      # 'r'
phrase[-1]     # 'y'  (sondan ilk)
phrase[-2]     # 'm'
Şekil 3.2: Python string indexing’i — 0-tabanlı + negatif (sondan)

s[-1] = “son karakter” — Python’un en sevilen deyimi. ML kodunda tensor[-1] “son katmanın çıktısı” için sürekli.

3.4.6 Substring Arama ve Değiştirme

phrase.index("A")      # 6  (bosluktan sonraki A)
phrase.index("Academy") # 6  (substring baslangici)
phrase.replace("Draft", "Elephant")  # 'Elephant Academy'

3.5 Sayılarla Çalışma — Aritmetik

print(3 + 4)     # 7
print(10 - 3)    # 7
print(3 * 4)     # 12
print(10 / 3)    # 3.3333333333333335  (TRUE bolme - hep float)
print(10 // 3)   # 3                    (TABAN bolme - tam sayi)
print(10 % 3)    # 1                    (MODULUS - kalan)
print(2 ** 3)    # 8                    (KUVVET)

İki tür bölme:

  • / — true division: sonuç her zaman float.
  • // — floor division: aşağı yuvarlar.

3.5.1 Modulus — Tek/Çift, Periyodik

print(8 % 2)     # 0  (cift sayi)
print(7 % 2)     # 1  (tek sayi)
print(epoch % 10 == 0)   # her 10 epoch'ta True (ML log pattern)
İpucuBuilder Notu — Aritmetiğin Tensor Hâli

Mosh’un öğrettiği aritmetik operatörler tensor’da otomatik element-wise:

import torch
a = torch.tensor([1, 2, 3, 4])
b = torch.tensor([10, 20, 30, 40])

a + b    # tensor([11, 22, 33, 44])
a * b    # tensor([10, 40, 90, 160])
a ** 2   # tensor([1, 4, 9, 16])
b % 3    # tensor([1, 2, 0, 1])

Aynı +, *, **, % sembolleri. Python’un operator overloading mekanizmasıyla NumPy/PyTorch/JAX bu sembolleri tensorlara genişletir.

3.6 Tip Dönüşümü

Mosh kritik bir problemi gösteriyor:

my_num = 5
print("Favori numaram " + my_num)   # TypeError!
# can only concatenate str (not "int") to str

+ operatörü str + int için tanımsız. Çözüm:

my_num = 5
print("Favori numaram " + str(my_num))    # str() ile cast
print(f"Favori numaram {my_num}")          # modern: f-string

Diğer yön — string’i sayıya:

giris = "42"
sayi = int(giris)    # 42 (int)
print(float("3.14"))  # 3.14
print(int("3.14"))    # ValueError - decimal yasak
print(int(float("3.14")))  # 3 (önce float, sonra int)
İpucuBuilder Notu — Tip Dönüşümü = ML Preprocessing

Tip dönüşümü ML pipeline’ının en yaygın işlemlerinden biri:

import pandas as pd
import torch

# CSV'den okuma:
df = pd.read_csv("data.csv")
df["age"] = df["age"].astype(int)        # str -> int kolon
df["score"] = df["score"].astype(float)

# Tensor tipi:
x = torch.tensor([1, 2, 3])              # int64 (default)
y = x.float()                            # float32
z = x.to(torch.float64)                  # float64

ML için sık karşılaşılan typecast’ler:

  • String → int (label encoding): "kedi"0, "kopek"1.
  • int → float32 (NN input): tüm input’lar genelde float32.
  • uint8 → float32 / 255 (image normalization): 0-255 piksel → 0-1.

3.7 İlk importmath Modülü

Mosh ilk import’u tanıtıyor:

“ozel matematik fonksiyonlari Python matematik denilen bir sey almak zorundayim” — Mosh (Türkçe dublaj), 46:03

from math import *

print(floor(3.7))    # 3
print(ceil(3.2))     # 4
print(sqrt(36))      # 6.0
print(pi)            # 3.141592653589793
print(log(100, 10))  # 2.0
Uyarıfrom math import * neden tehlikeli?

Çakışma yaratır — örneğin math.log ve numpy.log farklı; iki from X import * yapan kodda hangi log aktif belirsiz.

Profesyonel pattern:

import math
import numpy as np

math.log(100)    # 4.605... (skaler)
np.log(100)      # 4.605... (vektorize)

import math as m, import numpy as np — kısa aliaslarla namespace korunur.

3.8 Bu Dersin Özeti

  1. Değişken motivasyonu: Mosh’un “ad-yaş” hikayesi → tek-yerde-değiştir prensibi.
  2. Atama syntax’ı: ad = "değer". = matematik eşittir değil.
  3. İsimlendirme: snake_case (PEP 8), sabit UPPER_SNAKE, sınıf PascalCase.
  4. String araçları: escape, concat, methodlar, len, [i], sıfır-tabanlı.
  5. Aritmetik: +, -, *, /, //, %, **. Parantezle sıra.
  6. Tip dönüşümü: str(5), int("42"), float("3.14") — ML preprocessing’in mikro hali.
  7. İlk import: from math import * → ML evrenine açılan ilk kapı.
ÖnemliTek Bir Cümle

Bir değişken bir değeri bir isimle etiketler (ad = "Deniz"); Python üç temel tip (str, int, float) ile tüm temel verileri tutar; string’ler immutable ama metod-zengin (.upper, .replace, [i], len); aritmetik operatörleri (+ - * / // % **) skalardan tensora kadar aynı semboller; int() / str() / float() tip değiştirir; ve from math import * Python’un kütüphane evrenine açılan ilk kapıyı aralar.

3.9 Egzersizler

Egzersiz 1. Üç değişken tanımla — ad (string), doğum yılı (int), boy metre (float). Aşağıdaki çıktıyı üret:

Adim Deniz, 1985 dogumlu.
Bu yil 41 yasimi dolduruyorum.
Boyum 1.78 metre, yani 178 cm.

Egzersiz 2. Bir string ile üç dönüşüm yap (orijinal değişmesin):

mesaj = "Python ML icin essiz bir dildir"

mesaj_buyuk = ???      # Tum harfler buyuk
mesaj_js = ???         # "Python" yerine "JavaScript"
mesaj_uzunluk = ???    # Karakter sayisi

Egzersiz 3. Bu kodu yaz, çalıştır, çıktıları kağıt üstünde önceden tahmin et:

isim = "Hamedani"
print(isim[0])
print(isim[3])
print(isim[-1])
print(isim[-2])
print(len(isim))
print(isim[len(isim) - 1])

Egzersiz 4. (Aritmetik + modulus) Şu üç soruyu Python ile yanıtla:

  • 100 saniye kaç dakika ve saniye? (Beklenen: 1 dakika 40 saniye)
  • 365 gün kaç hafta ve gün kalır? (Beklenen: 52 hafta 1 gun)
  • 50 sayısı çift mi? (Beklenen: True)

İpucu: // ve %.

Egzersiz 5. (Builder eksen) Bu kod kullanıcıdan girdi alıyor (Ders 3 habercisi). Eksikleri doldur:

ad = input("Adin: ")
yas_str = input("Yasin: ")
yas_int = ???                # yas_str'i int'e cevir
yil = 2026 - yas_int
print(f"Merhaba {ad}! {yil} yilinda dogdun.")

???’yi int(yas_str) ile doldur. Bu küçük örnek, Ders 3’ün ana fikrini gösteriyor: input() string döner; sayı işlemine girmeden önce int() veya float() ile dönüştürmek şart.

3.10 Sonraki Ders İçin Hazırlık

Ders 3: Girdi ve İlk Etkileşim

Mosh’un Ch 8-10 (Input, Calculator, Mad Libs). Program artık sadece basmakla yetinmeyecek — kullanıcıdan veri almaya başlayacak.

  • Mosh’un Ch 8-10’unu izle (48:31 - 1:03:18, ~15 dk).
  • Şu cümleyi içselleştir:input() her zaman string döner; sayı işlemine girmeden önce int()/float() ile çevir.”
İpucuBu dersten tek bir şey alıp gideceksen

Değişken = ile bir değeri bir isimle etiketler; üç temel Python tipi (str, int, float) ve aralarındaki dönüşüm (str(), int(), float()) ML preprocessing’in mikro hâli; string’in metod-zenginliği (.upper, .replace, len, [i]) pandas’ın Series.str ailesine birebir aktarılır; ve from math import * ile Python’un kütüphane evrenine ilk kapıyı araladın — bu satır, sonra göreceğin import numpy as np’nin ilkel halinden başka bir şey değil.