📚 0.2: Python Ön Bilgiler

Veri Yapıları ve Algoritmalar için Gerekli Python Temelleri

📌 Bu Derste Göreceğiniz Python Kavramları

Bu ders notlarında kullanılan bazı Python özellikleri, standart programlama derslerinde anlatılmayabilir. Bu sayfa size gerekli ön bilgiyi sağlayacaktır.

1️⃣ f-string (Formatlı String)

f-string, Python 3.6+ ile gelen, string içine değişken yerleştirmenin en kolay yoludur.

Sözdizimi: f"Metin {değişken} metin"
❌ Eski Yöntem (format)
isim = "Ali"
yas = 25
print("İsim: {} Yaş: {}".format(isim, yas))
✅ Yeni Yöntem (f-string)
isim = "Ali"
yas = 25
print(f"İsim: {isim} Yaş: {yas}")
Python Kodu
# f-string Örnekleri
isim = "Ayşe"
not_ortalamasi = 85.7

# Basit kullanım
print(f"Öğrenci: {isim}")

# Matematiksel işlem
print(f"5 + 3 = {5 + 3}")

# Ondalık basamak formatlama
print(f"Not ortalaması: {not_ortalamasi:.1f}")
print(f"Pi sayısı: {3.14159265:.2f}")

# Hizalama
for i in range(1, 4):
    print(f"Sayı: {i:3d} - Karesi: {i**2:5d}")
Çıktı bekleniyor...

2️⃣ Ternary If (Tek Satırlık Koşul)

Ternary if, bir koşulu tek satırda yazmamızı sağlar. Karmaşık görünebilir ama öğrenince çok pratiktir.

Sözdizimi: değer_eğer_doğruysa if koşul else değer_eğer_yanlışsa
📝 Uzun Yol (4 satır)
if yas >= 18:
    durum = "Yetişkin"
else:
    durum = "Çocuk"
⚡ Kısa Yol (1 satır)
durum = "Yetişkin" if yas >= 18 else "Çocuk"
Python Kodu
# Ternary If Örnekleri

# Örnek 1: Yaş kontrolü
yas = 17
durum = "Yetişkin" if yas >= 18 else "Çocuk"
print(f"Yaş: {yas} → {durum}")

# Örnek 2: Pozitif/Negatif
sayi = -5
isaret = "Pozitif" if sayi > 0 else "Negatif veya Sıfır"
print(f"Sayı: {sayi} → {isaret}")

# Örnek 3: Çift/Tek kontrolü
sayi = 7
sonuc = "Çift" if sayi % 2 == 0 else "Tek"
print(f"{sayi} → {sonuc} sayı")

# Örnek 4: Maksimum bulma
a, b = 10, 25
maksimum = a if a > b else b
print(f"Max({a}, {b}) = {maksimum}")

# Örnek 5: Boş liste kontrolü
liste = []
mesaj = "Liste dolu" if liste else "Liste boş"
print(mesaj)
Çıktı bekleniyor...
⚠️ Dikkat: Ternary if'i sadece basit koşullarda kullanın. Karmaşık mantık için normal if-else daha okunabilirdir.

3️⃣ List Comprehension (Liste Oluşturma Kısayolu)

Döngü ile liste oluşturmayı tek satıra indirger.

Sözdizimi: [ifade for eleman in liste]
Filtreli: [ifade for eleman in liste if koşul]
📝 Uzun Yol
kareler = []
for i in range(5):
    kareler.append(i ** 2)
⚡ Kısa Yol
kareler = [i ** 2 for i in range(5)]
Python Kodu
# List Comprehension Örnekleri

# 1. Kareleri hesapla
kareler = [x**2 for x in range(6)]
print(f"Kareler: {kareler}")

# 2. Sadece çift sayılar (filtreli)
ciftler = [x for x in range(10) if x % 2 == 0]
print(f"Çift sayılar: {ciftler}")

# 3. Stringleri büyük harfe çevir
isimler = ["ali", "veli", "ayşe"]
buyuk_isimler = [isim.upper() for isim in isimler]
print(f"Büyük harfli: {buyuk_isimler}")

# 4. Negatif sayıları 0 yap
sayilar = [3, -1, 4, -5, 9, -2]
pozitifler = [x if x > 0 else 0 for x in sayilar]
print(f"Negatifler sıfırlandı: {pozitifler}")
Çıktı bekleniyor...

4️⃣ Sayılarda Alt Çizgi (_)

Büyük sayıları okunabilir yapmak için Python'da alt çizgi kullanabilirsiniz. Python bu alt çizgileri yok sayar.

Python Kodu
# Sayılarda okunabilirlik için alt çizgi

# Zor okunur:
buyuk_sayi1 = 1000000000

# Kolay okunur (Python bunu kabul eder):
buyuk_sayi2 = 1_000_000_000

print(f"Zor okunur: {buyuk_sayi1}")
print(f"Kolay okunur: {buyuk_sayi2}")
print(f"İkisi eşit mi? {buyuk_sayi1 == buyuk_sayi2}")

# Veri yapıları derslerinde sık kullanılır:
N = 1_000_000  # 1 Milyon
print(f"Test boyutu: {N:,} eleman")
Çıktı bekleniyor...

5️⃣ time Modülü ve Performans Ölçümü

Algoritmaların hızını ölçmek için time modülünü kullanırız.

🔑 Temel Fonksiyonlar

  • time.time() → Şu anki zaman (saniye olarak)
  • time.perf_counter() → Daha hassas ölçüm

Kullanım: Başlangıç zamanını kaydet → İşlemi yap → Bitiş zamanını kaydet → Farkı hesapla

Python Kodu
import time

# Basit zaman ölçümü şablonu
def olcumlu_toplama(n):
    baslangic = time.time()  # 1. Başlangıç

    toplam = 0
    for i in range(n):
        toplam += i

    bitis = time.time()      # 2. Bitiş
    gecen_sure = bitis - baslangic
    return gecen_sure

# Test
for boyut in [100_000, 1_000_000, 10_000_000]:
    sure = olcumlu_toplama(boyut)
    print(f"{boyut:>12,} eleman: {sure:.4f} saniye")
Çıktı bekleniyor...

6️⃣ Tuple Unpacking (Çoklu Atama)

Birden fazla değişkene aynı anda değer atayabilirsiniz.

Python Kodu
# Tuple Unpacking Örnekleri

# 1. Basit çoklu atama
a, b, c = 1, 2, 3
print(f"a={a}, b={b}, c={c}")

# 2. Swap (değişkenleri takas etme)
x, y = 10, 20
print(f"Önce: x={x}, y={y}")
x, y = y, x  # Geçici değişken gerekmez!
print(f"Sonra: x={x}, y={y}")

# 3. Fonksiyondan birden fazla değer döndürme
def min_max(liste):
    return min(liste), max(liste)

minimum, maksimum = min_max([3, 1, 4, 1, 5, 9])
print(f"Min: {minimum}, Max: {maksimum}")

# 4. For döngüsünde
koordinatlar = [(0, 0), (1, 2), (3, 4)]
for x, y in koordinatlar:
    print(f"Nokta: ({x}, {y})")
Çıktı bekleniyor...

7️⃣ enumerate() - İndex ile Döngü

Bir listeyi gezerken hem elemanı hem de indeksini almak için kullanılır.

❌ Manuel İndeks
liste = ["a", "b", "c"]
i = 0
for eleman in liste:
    print(i, eleman)
    i += 1
✅ enumerate() ile
liste = ["a", "b", "c"]
for i, eleman in enumerate(liste):
    print(i, eleman)
Python Kodu
# enumerate() Kullanımı
meyveler = ["Elma", "Armut", "Kiraz", "Üzüm"]

print("Meyve Listesi:")
for indeks, meyve in enumerate(meyveler):
    print(f"  {indeks}. {meyve}")

# Başlangıç indeksini değiştirme
print("\n1'den başlayarak:")
for sira, meyve in enumerate(meyveler, start=1):
    print(f"  {sira}. {meyve}")
Çıktı bekleniyor...

8️⃣ None ve is Operatörü

None, Python'da "hiçbir şey" anlamına gelir. Linked List ve Tree yapılarında sıkça kullanılır.

🔑 == vs is

  • == → Değerleri karşılaştırır
  • is → Aynı obje mi diye bakar (bellek adresi)

Kural: None kontrolü için her zaman is kullanın!

Python Kodu
# None Kullanımı

# Linked List Node örneği
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None  # Başlangıçta sonraki yok

# Node oluştur
node = Node(42)
print(f"Node verisi: {node.data}")
print(f"Sonraki node: {node.next}")

# None kontrolü (doğru yol)
if node.next is None:
    print("Bu node'un sonrakisi yok (son eleman)")

# None kontrolü (kısa yol)
if not node.next:
    print("Aynı anlama gelir")

# is vs == farkı
a = [1, 2, 3]
b = [1, 2, 3]
print(f"\na == b: {a == b}")  # True (değerler aynı)
print(f"a is b: {a is b}")    # False (farklı objeler)
Çıktı bekleniyor...