🔄 0.5: Döngüler

for ve while Döngüleri, range(), break ve continue

📖 Döngü Nedir?

Döngüler, bir kod bloğunu belirli sayıda veya bir koşul sağlandığı sürece tekrar tekrar çalıştırmak için kullanılır. Python'da iki tür döngü vardır: for ve while.

🎯 Döngü Ne Zaman Kullanılır?
  • 1'den 100'e kadar sayıları yazdırmak
  • Bir listedeki tüm elemanları dolaşmak
  • Kullanıcı "çık" yazana kadar giriş almak
  • Bir işlemi belirli sayıda tekrarlamak

🔢 1. for Döngüsü

Belirli sayıda veya bir koleksiyon üzerinde tekrar için kullanılır:

📝 Sözdizimi

for degisken in seri:
    # Her tekrarda bu blok çalışır

📐 range() Fonksiyonu

range() sayı serileri oluşturur:

📌 range() Kullanımları

# range(n) → 0'dan n-1'e kadar
for i in range(5):
    print(i)  # 0, 1, 2, 3, 4

# range(baslangic, bitis) → baslangic'tan bitis-1'e
for i in range(1, 6):
    print(i)  # 1, 2, 3, 4, 5

# range(baslangic, bitis, adim)
for i in range(0, 10, 2):
    print(i)  # 0, 2, 4, 6, 8 (2'şer artarak)

# Geriye doğru sayma
for i in range(5, 0, -1):
    print(i)  # 5, 4, 3, 2, 1
💡 range() Özet:
  • range(n) → 0, 1, 2, ..., n-1
  • range(a, b) → a, a+1, ..., b-1 (a dahil, b hariç)
  • range(a, b, c) → a'dan başlayıp c'şer artarak b'ye kadar

📌 1'den N'e Kadar Toplam

n = int(input("N: "))
toplam = 0

for i in range(1, n + 1):
    toplam += i

print(f"1'den {n}'e toplam: {toplam}")
1. BAŞLA 2. n oku 3. toplam = 0 4. i = 1'den n'e kadar TEKRARLA: 5. toplam = toplam + i 6. toplam yazdır 7. BİTİR
flowchart TD A([BAŞLA]) --> B[/n oku/] B --> C[toplam = 0, i = 1] C --> D{i ≤ n ?} D -->|Evet| E[toplam = toplam + i] E --> F[i = i + 1] F --> D D -->|Hayır| G[/toplam yazdır/] G --> H([BİTİR])

📌 Çarpım Tablosu

sayi = int(input("Hangi sayının çarpım tablosu? "))

print(f"\n{sayi}'ın Çarpım Tablosu:")
print("-" * 20)

for i in range(1, 11):
    sonuc = sayi * i
    print(f"{sayi} x {i} = {sonuc}")
5'ın Çarpım Tablosu: -------------------- 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 5 x 10 = 50

⏳ 2. while Döngüsü

Koşul True olduğu sürece devam eder:

📝 Sözdizimi

while koşul:
    # Koşul True olduğu sürece çalışır
    # Dikkat: Sonsuz döngüye dikkat!

📌 Temel while Örneği

i = 1
while i <= 5:
    print(i)
    i += 1  # Bu satır olmadan sonsuz döngü!

print("Döngü bitti")
1 2 3 4 5 Döngü bitti
⚠️ Sonsuz Döngü Tehlikesi!

while döngüsünde koşulun bir noktada False olmasını sağlamalısınız. Aksi halde program sonsuza kadar çalışır.

# YANLIŞ - Sonsuz döngü!
i = 1
while i <= 5:
    print(i)
    # i artırılmadı, koşul hep True!

# DOĞRU
i = 1
while i <= 5:
    print(i)
    i += 1  # Koşul sonunda False olacak

📌 Üs Alma (Exponentiation)

taban = int(input("Taban: "))
us = int(input("Üs: "))

sonuc = 1
i = 1

while i <= us:
    sonuc = sonuc * taban
    i += 1

print(f"{taban}^{us} = {sonuc}")
1. BAŞLA 2. taban, üs oku 3. sonuç = 1 4. i = 1 5. i ≤ üs İKEN TEKRARLA: 6. sonuç = sonuç × taban 7. i = i + 1 8. sonuç yazdır 9. BİTİR
flowchart TD A([BAŞLA]) --> B[/taban, üs oku/] B --> C[sonuç = 1, i = 1] C --> D{i ≤ üs ?} D -->|Evet| E[sonuç = sonuç × taban] E --> F[i = i + 1] F --> D D -->|Hayır| G[/sonuç yazdır/] G --> H([BİTİR])

📌 Kullanıcıdan Sürekli Giriş Alma

toplam = 0
sayi = int(input("Sayı girin (0 = çık): "))

while sayi != 0:
    toplam += sayi
    sayi = int(input("Sayı girin (0 = çık): "))

print(f"Toplam: {toplam}")

⚡ 3. break ve continue

🛑 break - Döngüyü Sonlandır

📌 break Örneği

# İlk 5'e bölünen sayıyı bul ve dur
for i in range(1, 100):
    if i % 5 == 0:
        print(f"İlk 5'e bölünen: {i}")
        break  # Döngüden çık
    print(f"Kontrol: {i}")

print("Döngü bitti")
Kontrol: 1 Kontrol: 2 Kontrol: 3 Kontrol: 4 İlk 5'e bölünen: 5 Döngü bitti

⏭️ continue - Sonraki İterasyona Geç

📌 continue Örneği

# 3'e bölünenleri atla
for i in range(1, 11):
    if i % 3 == 0:
        continue  # Bu iterasyonu atla
    print(i)
1 2 4 5 7 8 10

📌 Asal Sayı Kontrolü (break ile)

n = int(input("Sayı: "))

if n < 2:
    print("Asal değil")
else:
    asal = True
    i = 2
    
    while i * i <= n:
        if n % i == 0:
            asal = False
            break  # Bölen bulundu, döngüden çık
        i += 1
    
    if asal:
        print(f"{n} asal sayıdır")
    else:
        print(f"{n} asal değildir")
1. BAŞLA 2. n oku 3. EĞER n < 2 ise "Asal Değil" yaz, BİTİR 4. i = 2 5. i × i ≤ n İKEN TEKRARLA: 6. EĞER n % i == 0 ise "Asal Değil" yaz, BİTİR 7. i = i + 1 8. "Asal" yaz 9. BİTİR

🔄 4. Döngü-else Yapısı

Python'da döngüler else bloğu alabilir. Bu blok döngü normal şekilde (break olmadan) biterse çalışır:

📌 while-else ile Asal Kontrolü

n = int(input("Sayı: "))

if n < 2:
    print("Asal değil")
else:
    i = 2
    while i * i <= n:
        if n % i == 0:
            print("Asal değil")
            break
        i += 1
    else:
        # break çalışmadıysa (bölen bulunamadıysa)
        print("Asal")

📌 for-else Örneği

# Listede eleman arama
liste = [3, 7, 12, 45, 23]
aranan = 12

for eleman in liste:
    if eleman == aranan:
        print(f"{aranan} bulundu!")
        break
else:
    # break çalışmadıysa (bulunamadıysa)
    print(f"{aranan} listede yok")

🎯 5. Pratik Örnekler

📌 Örnek 1: EBOB (Öklid Algoritması)

a = int(input("a: "))
b = int(input("b: "))
orj_a, orj_b = a, b

while b != 0:
    r = a % b
    a = b
    b = r

print(f"{orj_a} ve {orj_b}'nin EBOB'u: {a}")
1. BAŞLA 2. a, b oku 3. b ≠ 0 İKEN TEKRARLA: 4. r = a % b 5. a = b 6. b = r 7. a yazdır (EBOB) 8. BİTİR
flowchart TD A([BAŞLA]) --> B[/a, b oku/] B --> C{b ≠ 0 ?} C -->|Evet| D[r = a % b] D --> E[a = b] E --> F[b = r] F --> C C -->|Hayır| G[/a yazdır/] G --> H([BİTİR])

📌 Örnek 2: EKOK

# EKOK = (a × b) / EBOB

def ebob(a, b):
    while b != 0:
        a, b = b, a % b
    return a

a = int(input("a: "))
b = int(input("b: "))

eb = ebob(a, b)
ekok = (a * b) // eb

print(f"EBOB: {eb}")
print(f"EKOK: {ekok}")

📌 Örnek 3: Onluk → İkilik Dönüşüm

n = int(input("Onluk sayı: "))

if n == 0:
    print("İkilik: 0")
else:
    ikili = ""
    sayi = n
    
    while sayi > 0:
        bit = sayi % 2
        ikili = str(bit) + ikili
        sayi = sayi // 2
    
    print(f"{n} → {ikili}")
1. BAŞLA 2. n oku 3. EĞER n == 0 ise "0" yaz, BİTİR 4. ikili = "" 5. n > 0 İKEN TEKRARLA: 6. bit = n % 2 7. ikili = bit + ikili 8. n = n // 2 9. ikili yaz 10. BİTİR

📌 Örnek 4: N ile M Arası Toplam

# Yöntem 1: Döngü ile (O(n) zaman)
n = int(input("n: "))
m = int(input("m: "))

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

print(f"Döngü ile: {toplam}")

# Yöntem 2: Formül ile (O(1) zaman) - Gauss
terim_sayisi = (m - n) + 1
toplam_formul = terim_sayisi * (n + m) // 2
print(f"Formül ile: {toplam_formul}")

📌 Örnek 5: Sayı Tahmin Oyunu

import random

gizli = random.randint(1, 100)
tahmin_sayisi = 0

print("1-100 arası bir sayı tuttum!")

while True:
    tahmin = int(input("Tahminin: "))
    tahmin_sayisi += 1
    
    if tahmin < gizli:
        print("Daha büyük!")
    elif tahmin > gizli:
        print("Daha küçük!")
    else:
        print(f"Tebrikler! {tahmin_sayisi} denemede buldun!")
        break

📌 Örnek 6: Faktöriyel Hesaplama

n = int(input("n: "))

faktoriyel = 1
for i in range(1, n + 1):
    faktoriyel *= i

print(f"{n}! = {faktoriyel}")

# Örnek: 5! = 1 × 2 × 3 × 4 × 5 = 120

⚖️ 6. for vs while - Hangisini Kullanmalı?

for Döngüsü while Döngüsü
Tekrar sayısı belirli Tekrar sayısı belirsiz
Liste/dizi üzerinde dolaşma Koşul sağlandıkça devam
range() ile sayı serisi Kullanıcı "çık" diyene kadar
Daha güvenli (sonsuz döngü riski az) Sonsuz döngü riski var
💡 Pratik Kural:
  • "n kere yap" → for
  • "şart sağlandıkça yap" → while
  • Liste/dizi dolaşma → for
  • Kullanıcı girişi bekleme → while
🔄 Önemli: for ve while Birbirinin Yerine Kullanılabilir!

Aslında her for döngüsü while ile, her while döngüsü de for ile yazılabilir. İkisi matematiksel olarak eşdeğerdir.

📌 Aynı İşlem: for vs while

# for ile 1'den 5'e kadar yazdır
for i in range(1, 6):
    print(i)

# Aynısı while ile
i = 1
while i < 6:
    print(i)
    i += 1
# while ile kullanıcı girişi
while True:
    x = input("Sayı (çık için q): ")
    if x == 'q':
        break
    print(f"Girdiniz: {x}")

# Aynısı for ile (iter kullanarak)
import sys
for line in iter(lambda: input("Sayı (çık için q): "), 'q'):
    print(f"Girdiniz: {line}")

⚠️ 7. Sonsuz Döngü (Infinite Loop)

🔴 Sonsuz Döngü Nedir?

Hiçbir zaman bitmeyen döngüye sonsuz döngü denir. Program sonsuza kadar çalışır ve yanıt vermez hale gelir.

❌ Yanlış: Sonsuz Döngü Örnekleri

# HATA 1: Sayacı artırmayı unuttuk!
i = 0
while i < 5:
    print(i)
    # i += 1  ← Bu satır eksik! i hep 0 kalır

# HATA 2: Koşul hiçbir zaman False olmaz
x = 10
while x > 0:
    print(x)
    x += 1  # Azaltmak yerine artırıyoruz!

# HATA 3: Yanlış koşul
while True:
    print("Sonsuza kadar...")
    # break yok!
💡 Sonsuz Döngüden Kurtulma:
  • Terminal'de: Ctrl + C tuşlarına basın
  • IDE'de: Stop/Kill butonuna tıklayın
  • Önleme: Döngü değişkenini doğru güncellediğinizden emin olun

✅ Bilinçli Sonsuz Döngü Kullanımı

Bazen sonsuz döngü bilerek kullanılır. Bu çok yaygın bir pattern'dir!

🎯 En Yaygın Kullanım: Kullanıcıdan Sürekli Girdi Alma
# Kullanıcı "q" yazana kadar devam et
while True:
    girdi = input("Bir sayı girin (çıkmak için q): ")
    
    if girdi == "q":
        print("Programdan çıkılıyor...")
        break
    
    # Sayıyı işle
    try:
        sayi = int(girdi)
        print(f"{sayi}'nin karesi = {sayi ** 2}")
    except ValueError:
        print("Geçersiz sayı, tekrar deneyin.")
Bir sayı girin (çıkmak için q): 5 5'nin karesi = 25 Bir sayı girin (çıkmak için q): 12 12'nin karesi = 144 Bir sayı girin (çıkmak için q): abc Geçersiz sayı, tekrar deneyin. Bir sayı girin (çıkmak için q): q Programdan çıkılıyor...
🎮 Menü Sistemi Örneği
# Basit menü sistemi
while True:
    print("\n=== MENÜ ===")
    print("1. Toplama")
    print("2. Çıkarma")
    print("3. Çıkış")
    
    secim = input("Seçiminiz: ")
    
    if secim == "3":
        print("Görüşürüz!")
        break
    elif secim == "1":
        print("Toplama seçildi")
    elif secim == "2":
        print("Çıkarma seçildi")
    else:
        print("Geçersiz seçim!")
🖥️ Sunucu ve Oyun Döngüleri
# Sunucu simülasyonu
while True:
    istek = bekle_istek()
    if istek == "kapat":
        break
    isle(istek)

# Oyun döngüsü
while True:
    guncelle_oyun()
    ciz_ekran()
    if oyun_bitti:
        break
💡 Alternatif Yöntem: iter() ile (İleri Seviye)

Aynı işlemi iter() ve lambda ile de yapabilirsiniz:

# iter kullanarak - aynı işlem daha kısa
for line in iter(lambda: input("Sayı (çık için q): "), 'q'):
    print(f"Girdiniz: {line}")

📝 Not: iter ve lambda kavramlarını şu an anlamasanız sorun değil. İlerleyen konularda öğreneceksiniz. Şimdilik while True + break pattern'ini kullanın.

🔍 8. Döngülerde Hata Ayıklama (Debugging)

Döngüler, özellikle iç içe döngüler, hata yapmaya en açık yerlerdir. Debugging araçları bu hataları bulmada çok yardımcıdır.

🛠️ Debugging Neden Önemli?
  • Döngü değişkenlerinin her adımda değerini görürsünüz
  • Kodun satır satır ne yaptığını izlersiniz
  • Sonsuz döngü neden oluştuğunu anlarsınız
  • İç içe döngülerde hangi iç döngünün ne zaman çalıştığını görürsünüz

🖥️ VS Code'da Debugging

  1. Sol kenarda satır numarasına tıklayarak breakpoint koyun (kırmızı nokta)
  2. F5 tuşuna basın veya Run → Start Debugging
  3. Program breakpoint'te durduğunda:
    • F10 → Bir adım ilerle (Step Over)
    • F11 → Fonksiyonun içine gir (Step Into)
    • F5 → Devam et (Continue)
  4. Sol panelde Variables bölümünden değişkenleri izleyin

🔧 PyCharm'da Debugging

  1. Satır numarasına tıklayarak breakpoint koyun
  2. Sağ tık → Debug veya yeşil böcek ikonuna tıklayın
  3. Aynı kısayollar: F8 (Step Over), F7 (Step Into)
  4. Variables panelinde tüm değişkenleri görün
💡 Tavsiye: Döngüleri anlamakta zorlanıyorsanız, debugging aracı ile kodu adım adım çalıştırın. Her adımda değişkenlerin nasıl değiştiğini görmek, döngü mantığını anlamanın en iyi yoludur!

📋 Özet

Bu Derste Öğrendiklerimiz:
  1. for: Belirli sayıda tekrar veya koleksiyon dolaşma
  2. range(): Sayı serileri oluşturma (başlangıç, bitiş, adım)
  3. while: Koşul True olduğu sürece devam
  4. break: Döngüyü anında sonlandır
  5. continue: Bu iterasyonu atla, sonrakine geç
  6. else: Döngü normal biterse çalışır
  7. for ≡ while: İkisi birbirinin yerine kullanılabilir
  8. Sonsuz döngü: Ctrl+C ile durdurulur, dikkatli olun!