Python Döngüleri: For, While ve İteratör Örnekleri
Python Döngüleri
Python Döngüleri: For, While ve İteratör Örnekleri

Giriş
Python'da veri üzerinde yineleme (iteration) günlük programlamada sık kullanılır. Bu rehberde for ve while döngülerinin temel ve ileri kullanım örneklerini, enumerate, iter(), next() ve yield ile oluşturulan jeneratörlerin pratik kullanımını göreceksiniz. Örnekler, kısa ve doğrudan uygulama amaçlıdır; örnek kodlar okunaklı olması için metin içinde gösterilmiştir.
For döngüsü: Temel kullanım ve enumerate örnekleri
For döngüsü, sıralı veri yapılarını (list, tuple, string, range vb.) dolaşmak için kullanılır. Sıklıkla indeks ve değeri aynı anda gerektiğinde enumerate tercih edilir.
Basit for örneği
nums = [10, 20, 30]
for n in nums:
print(n)
Açıklama: Yukarıdaki kod listedeki her öğeyi sırayla yazdırır.
Enumerate ile indeks ve değer
words = ['elma', 'armut', 'muz']
for i, w in enumerate(words):
print(i, w)
İsterseniz başlangıç indeksini değiştirebilirsiniz:
for i, w in enumerate(words, start=1):
print(i, w)
Bu yaklaşım, döngü içinde indeksle birlikte değere ihtiyaç duyduğunuz her durumda daha temiz ve güvenli bir yapıdır.
Dictionary üzerinde iterasyon
d = {'a': 1, 'b': 2}
for k in d: # anahtarlar üzerinde iterasyon
print(k, d[k])
for k, v in d.items(): # anahtar-değer çifti
print(k, v)
While döngüsü ve while-else kullanımı
While döngüsü, bir koşul doğru olduğu sürece tekrarlama yapar. Döngü sonlandığında opsiyonel else bloğu çalışır; ancak döngü break ile erken sonlandırılırsa else çalışmaz.
While örneği
i = 0
while i < 3:
print(i)
i += 1
else:
print('Döngü tamamlandı')
Bu kod, i 3 olana kadar sayar ve döngü doğal olarak bittiğinde else bloğu çalışır.
Break ile else atlanması
i = 0
while i < 5:
if i == 2:
break
print(i)
i += 1
else:
print('Bu mesaj break ile sonlanmadığında görünür')
Burada i 2 olduğunda döngü break ile kesildiği için else çalışmayacaktır. Bu davranış döngü akışını kontrol etmek için kullanışlıdır.
İteratörler: iter(), next() ve StopIteration
İteratörler, bir koleksiyondaki öğelere tek tek erişim sağlayan nesnelerdir. Bir nesneden iteratör elde etmek için iter() kullanılır; öğeleri almak için ise next() çağrılır. Tüm öğeler tükendiğinde Python StopIteration istisnasını fırlatır. Bu mekanizma Python'un resmi belgelerinde iteratör nesneleri olarak açıklanır (bkz. Python 3.14.3 dokümantasyonu).
Manuel iterator kullanımı
lst = [1, 2, 3]
it = iter(lst)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
try:
print(next(it)) # StopIteration fırlatır
except StopIteration:
print('İterasyon tamamlandı')
Pratik olarak for döngüsü bu mekanizmayı arka planda yönetir, ancak bazı durumlarda manuel kontrol (ör. birden fazla iterator paralel tüketme) gereklidir.
Jeneratörler: yield ve jeneratör ifadeleri
Jeneratörler, yield anahtar kelimesiyle oluşturulan özel fonksiyonlardır. Jeneratörler her seferinde bir öğe üretir ve işlem ihtiyaç duyulana kadar bellek üzerinde tüm veriyi tutmaz; bu da büyük veri setleriyle çalışırken bellek verimliliği sağlar.
Basit jeneratör fonksiyonu
def say_ileri(n):
i = 0
while i < n:
yield i
i += 1
for x in say_ileri(5):
print(x)
Yukarıdaki fonksiyon her çağrıldığında bir sonraki değeri döndürür; fonksiyonun tüm sonuçlarını belleğe almak yerine gerektiği kadar tüketebilirsiniz.
Jeneratör ifadeleri (generator expressions)
squares = (x * x for x in range(10))
for s in squares:
print(s)
Parantez içindeki yapı, liste oluşturmak yerine jeneratör döndürür; bu da büyük aralıklar için daha az bellek kullanımı demektir.
next() ile jeneratör tüketmek
g = (i for i in range(3))
print(next(g)) # 0
print(next(g)) # 1
print(next(g)) # 2
# next(g) artık StopIteration fırlatır
Pratik ipuçları ve kontrol listesi (checklist)
- Koleksiyon üzerinde basit dolaşım için for kullanın; indeks gerekiyorsa enumerate tercih edin.
- Koşula dayalı tekrarlar için while kullanın, fakat sonsuz döngülerden kaçınmak için koşul ve artış/azalış mantığını açık tutun.
- Büyük veri veya akış tabanlı okumalarda jeneratör kullanarak bellek tasarrufu sağlayın.
- iter() ve next() ile manuel tüketim gerekiyorsa StopIteration için try/except kullanın veya next(it, varsayılan) biçimini tercih edin.
- Bir döngüyü break ile erken sonlandırdığınızda else bloğunun çalışmayacağını unutmayın; bunu akış kontrolü için kullanabilirsiniz.
Örnek: Dosya satırlarını jeneratörle işleme
Büyük bir dosyayı belleğe tamamen almadan satır satır işlemek için jeneratörleri kullanabilirsiniz. Aşağıdaki örnek, dosyayı açıp satırları filtreleyen basit bir yaklaşımı gösterir.
def satir_filtrele(dosya_yolu):
with open(dosya_yolu, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line: # boş olmayan satırlar
yield line.lower()
# Kullanım
for satir in satir_filtrele('büyük_dosya.txt'):
işlem(satir)
Bu örnekte dosya satırları tek tek okunduğu için bellek kullanımı düşük kalır ve işlem hattına kolayca entegre edilebilir.
Sık yapılan hatalar ve dikkat edilmesi gerekenler
- Listeyi döngü sırasında değiştirmek beklenmeyen sonuçlara yol açabilir; gerekiyorsa kopya alın veya comprehension kullanın.
- while döngüsünde koşulun değiştiğinden emin olun; aksi takdirde döngü sonsuz döngüye girer.
- next() kullanırken StopIteration ile karşılaşılacağını göz önünde bulundurun; alternatif olarak
next(it, varsayılan)kullanımını tercih edebilirsiniz.
Sonuç
For ve while döngüleri Python'un temel araçlarıdır; enumerate, iter(), next() ve yield gibi yapılar ise yinelemeyi daha esnek ve verimli hale getirir. Jeneratörler, özellikle büyük veri ile çalışırken bellek avantajı sağlar. Daha ayrıntılı teknik bilgi için Python'un resmi dokümantasyonuna bakabilirsiniz: Python 3.14.3 - Iterator Objects.