
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.
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ış
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.
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.
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.
for i in range(5):
print(i)
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.
for _ in range(3):
print("Tekrar")
Burada _ değişkeni, değerin kullanılmadığını ifade eden yaygın bir konvansiyondur.
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):
...
colors = ["red", "green", "blue"]
for i, c in enumerate(colors):
print(i, c)
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, 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:
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.
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.
numbers = [3, 7, 2, 9, 5]
target = 9
for n in numbers:
if n == target:
print("Bulundu:", n)
break
print("Kontrol edilen:", n)
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.
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.
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.
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.
İ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.
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.
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.
Yorumlar