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.