ProgramlamaPython Backend Geliştirici

Python'da for-in döngüsü nasıl çalışır? Bu mekanizmayı desteklemek için hangi altyapı sağlanır ve özel bir nesne üzerinde iterasyon yaptığımızda "kaputun altında" neler olur?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Kandırmaca soru.

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)

Konunun incelikleri hakkında bilgi eksikliğinden kaynaklanan gerçek hatalara dair örnekler.


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.