Python Döngüleri: For ve While ile Etkili Örnekler
Python Döngüleri

Python Döngüleri: For ve While ile Etkili Örnekler

Python Döngüleri

5 dk okuma süresi
Bu rehber, Python’daki for ve while döngülerini günlük kullanım senaryolarıyla açıklar. range() ve enumerate() ile indeksli iterasyon, break/continue akışı ve for/while ile kullanılan else bloğunun ne zaman çalıştığı gibi kritik nüansları kısa, uygulanabilir Python kod snippetleriyle öğrenirsiniz.
Python Döngüleri: For ve While ile Etkili Örnekler

Python döngülerini doğru zihniyetle öğrenin

Python’da döngüler denince iki ana yapı öne çıkar: for ve while. Yeni başlayanların sık yaptığı hata, for döngüsünü “sayısal sayaçla dönen C tarzı döngü” gibi düşünmektir. Python’daki for döngüsü, temelde bir iterable (liste, string, range, generator vb.) üzerinde sırayla ilerleyen bir “foreach” yaklaşımıdır. Bu davranış, Python resmi öğreticisinde açıkça anlatılır.

Bu yazıda şu hedefle ilerleyeceğiz: günlük işlerde hemen kullanabileceğiniz python kod snippetleri ile hem for/while temellerini hem de pratikte fark yaratan range, enumerate, break/continue ve loop-else (döngü-else) davranışını netleştirmek.


for döngüsü: “iterable” üzerinde güvenli ve okunabilir iterasyon

Python’da for, bir iterable’dan her adımda bir öğe alır. Liste, demet (tuple), sözlük, string veya range gibi yapılar bu kapsama girer. Temel şablon:

for item in iterable:
    # item ile çalış

Örnek 1: Liste üzerinde dolaşmak

names = ["Ada", "Linus", "Grace"]

for name in names:
    print("Merhaba,", name)

Bu tarz kullanım, indeks yönetimini sizin yerinize Python’un yapmasına izin verdiği için genellikle daha okunabilir olur.

Örnek 2: String bir iterable’dır

word = "python"

for ch in word:
    print(ch)

String karakter karakter dolaşılabilir; bu da metin işleme görevlerinde for döngüsünü çok pratik kılar.


range(): ardışık sayılar için “liste değil”, range nesnesi

Sayısal aralıklarla döngü kurmak istediğinizde çoğu zaman range() kullanırsınız. Python 3’te range() bir liste üretmez; iterasyon için verimli bir range nesnesi sağlar. Bu davranış hem öğreticide hem de standart tipler dokümantasyonunda açıklanır: Python Tutorial – Control Flow Tools ve Built-in Types – range.

range() hızlı referans

  • range(stop): 0’dan stop’a (hariç) kadar
  • range(start, stop): start’tan stop’a (hariç) kadar
  • range(start, stop, step): adım (step) ile ilerler

Örnek 3: 0–4 arası sayılar

for i in range(5):
    print(i)

Örnek 4: Start/stop/step kullanımı

for i in range(2, 10, 2):
    print(i)

Not: Negatif adım da kullanılabilir. Örneğin tersten saymak için step’i negatif verirsiniz.

Örnek 5: “N kez tekrar et” kalıbı

for _ in range(3):
    print("Tekrar")

Burada _ değişkeni, değerin kullanılmadığını ifade eden yaygın bir konvansiyondur.


enumerate(): indeks + değer ihtiyacı için temiz yaklaşım

Bir koleksiyon üzerinde dolaşırken hem indeksi hem de öğeyi istiyorsanız, çoğu zaman enumerate() en anlaşılır çözümdür. Resmi tanımı için: Built-in Functions – enumerate().

Genellikle şu kalıp tercih edilir:

for index, value in enumerate(iterable, start=0):
    ...

Örnek 6: Listeyi indeksleriyle yazdırmak

colors = ["red", "green", "blue"]

for i, c in enumerate(colors):
    print(i, c)

Örnek 7: 1’den başlayan indeksleme

colors = ["red", "green", "blue"]

for i, c in enumerate(colors, start=1):
    print(f"{i}. renk: {c}")

Neden enumerate? range(len(...)) ile de indeks üretilebilir; ancak enumerate hem daha doğrudan bir niyet anlatır hem de “indeks–değer” ikilisini tek yerde toplayarak okunabilirliği artırır. Bu, resmi dokümanların da örneklediği yaygın bir pratiktir.


while döngüsü: koşul doğru olduğu sürece devam

while, bir koşul True olduğu sürece çalışır. Dil düzeyi tanım ve semantik ayrıntılar için Python dil referansı: The while statement.

While genellikle şu durumlarda uygundur:

  • Kaç kez döneceğiniz önceden bilinmiyorsa (ör. kullanıcı girişi, bir koşul sağlanana kadar deneme)
  • Bir durum makinesi / sürekli kontrol döngüsü gerekiyorsa

Örnek 8: Koşul sağlanana kadar tekrar dene

value = 0

while value < 3:
    print("value:", value)
    value += 1

Bu örnek, “koşul doğruyken devam et” mantığını gösterir. Burada güncelleme (value += 1) yapılmazsa döngü gereğinden uzun sürebilir; while kullanırken koşulun nasıl sonlanacağını özellikle düşünmek gerekir.


break ve continue: akışı kontrollü yönetme

Python’da break ve continue ile döngü akışını değiştirebilirsiniz. Bu davranışlar Python öğreticisinde örneklerle açıklanır: More Control Flow Tools.

  • break: En içteki döngüyü hemen bitirir.
  • continue: O iterasyonun kalanını atlar, bir sonraki iterasyona geçer.

Örnek 9: break ile arama yapma

numbers = [3, 7, 2, 9, 5]
target = 9

for n in numbers:
    if n == target:
        print("Bulundu:", n)
        break
    print("Kontrol edilen:", n)

Örnek 10: continue ile filtreleme

numbers = [1, 2, 3, 4, 5, 6]

for n in numbers:
    if n % 2 == 1:
        continue
    print("Çift:", n)

Bu yaklaşım, iç içe if bloklarını azaltarak okunabilirliği artırabilir.


Döngüde else: “break olmadıysa çalışır” nüansı

Python’da hem for hem de while ile birlikte bir else bloğu kullanılabilir. Kritik kural şudur: else bloğu, döngü break ile sonlandırılmadıysa çalışır. Bu özellik resmi öğreticide özellikle belirtilir: Control Flow Tools.

Örnek 11: Arama + loop-else

numbers = [4, 8, 15, 16, 23, 42]
target = 99

for n in numbers:
    if n == target:
        print("Bulundu:", n)
        break
else:
    print("Listede yok:", target)

Bu kalıp, “bulunduysa break, bulunmadıysa else” akışını tek bir yerde topladığı için arama senaryolarında oldukça kullanışlıdır.


for mu while mı? Hızlı karar rehberi

  • Elinizde bir iterable varsa (liste, dosya satırları, range, generator): çoğu zaman for daha doğaldır.
  • Koşula bağlı tekrar gerekiyorsa ve iterasyon sayısı belirsizse: genellikle while uygun olur.
  • İndeks gerekiyorsa: önce enumerate() düşünün.

Pratik bir kural: “Bir şeylerin üzerinden geçiyorum” diyorsanız for; “Bir koşul sağlanana kadar deniyorum” diyorsanız while ile başlayın.


İyi pratikler: okunabilirlik, doğruluk ve sürdürülebilirlik

1) range(len(...)) yerine enumerate() düşünün

İndeks ihtiyacınız olduğunda enumerate çoğu zaman daha temizdir. range(len(...)) hâlâ geçerli bir araçtır; ancak niyetinizi daha açık ifade etmek genellikle daha iyi bir varsayılandır.

2) Döngü içinde çok iş yapıyorsanız, yardımcı fonksiyonlara ayırın

Döngü gövdesi büyüdükçe test etmek ve okumak zorlaşır. Döngü içinde yapılan işi küçük fonksiyonlara bölmek, hatalı varsayımları daha erken yakalamanıza yardımcı olur.

3) Performans varsayımı yapmayın; gerekiyorsa ölçün

Resmi dokümantasyon döngü davranışını iyi açıklar; ancak “şu yapı kesin daha hızlıdır” gibi mikro kıyasların çoğu kullanım bağlamına bağlıdır. Eğer performans sizin için önemliyse, kendi verinizle timeit gibi araçlarla ölçüm yapmayı planlayın. Bu yazı, ölçüm yapılmadan kesin performans hükmü vermekten kaçınır.


Mini kontrol listesi (kopyala–uygula)

  • for: Elimde iterable var mı? Varsa for ile başlayın.
  • range: Sayı aralığı mı gerekiyor? range() kullanın; listeye çevirmeye gerek yoksa çevirmeyin.
  • enumerate: İndeks de gerekiyor mu? enumerate(iterable, start=1/0) düşünün.
  • while: Bitiş koşulu net mi? Döngünün nasıl sonlanacağını tasarlayın.
  • break/continue: Akış daha netleşiyor mu? Gereksiz karmaşıklık yaratıyorsa sadeleştirin.
  • loop-else: “break olmadıysa” mantığı işinize yarıyor mu? Arama senaryolarında kullanışlıdır.

Kısa kaynaklar (resmi dokümantasyon)

Yorumlar

Henüz yorum yapılmamış. İlk yorumu sen yaz.