Python'da for-in döngüsü, iki özel metot olan __iter__() ve __next__() temelinde çalışan bir iterasyon protokolü aracılığıyla uygulanır. Döngü başladığında, Python iter(obj) çağrısını yapar (bu, __iter__ metodunu arar). Eğer bir iteratör nesnesi dönerse ve __next__() tanımlıysa, döngü bu metodu her bir sonraki öğeyi almak için çağırmaya başlar.
Eğer öğe başarıyla sağlanırsa — iterasyon devam eder. StopIteration istisnası atıldığında, döngü tamamlanır.
Özelleştirilmiş bir iteratör örneği:
class Counter: def __init__(self, low, high): self.current = low self.high = high def __iter__(self): return self def __next__(self): if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1 for num in Counter(1, 3): print(num) # 1, 2, 3 olarak yazdırır
Hüner: Pek çok standart Python yapısı, iteratör protokolünü uygular; kendi nesnelerinizi de benzer şekilde yapabilirsiniz.
Python'da herhangi bir nesne ile for-in döngüsü kullanılabilir mi? İterasyon yapılabilir nesne ile iteratör arasındaki fark nedir?
Cevap: Hayır, for-in döngüsü, nesnenin iterable olmasını gerektirir, yani __iter__() metodunu uygulayarak bir iteratör (sadece __next__() metodu olan bir nesne) döndürmelidir. Bir iteratör, __iter__() üzerinden kendisini döndürürken, iterable nesne bunu yapmaz.
Örnek:
lst = [1, 2, 3] iterator = iter(lst) print(hasattr(lst, '__iter__')) # Doğru print(hasattr(iterator, '__next__')) # Doğru (iteratör) print(hasattr(lst, '__next__')) # Yanlış (iteratör değil)
Hikaye
Proje: Büyük dosyaların işlenmesi.
Sorun: Projede, dosya nesnesi üzerinden (dosyanın satırlarına iterasyon yaparak) iki kez geçmeye çalıştılar, ancak yeni bir dosya açmadan — ikinci iterasyonda hiçbir satır almadılar (gösterici dosyanın sonunda zaten!).
Hikaye
Proje: Kendi koleksiyon sınıfını çerçeve ile entegre etme.
Sorun: Sınıf yalnızca
__getitem__uyguladı, ancak__iter__uygulamadı ve jeneratörler ve standart döngülerle (for) uyumlu değildi. Bu nedenle, bir iteratör bekleyen üçüncü taraf kütüphaneleri bozuldu.
Hikaye
Proje: Özel koleksiyonlarda map/filter kullanımı.
Sorun: Kendi liste sınıfı
__iter__ve__next__uygulamadı ve birçok standart Python fonksiyonu ile uyumsuz kaldı, bu da yalnızca entegrasyon testleri sonrasında ortaya çıktı ve önemli bir yeniden yapılandırma gerektirdi.