Python'da iteratorlar — __iter__() ve __next__() metodlarını uygulayan nesnelerdir. Iteratorlar mevcut durumlarını yönetir ve her next() çağrısında dizinin bir sonraki elemanını döndüren veya sonuna geldiğinde StopIteration istisnası fırlatan nesnelerdir.
Iterable nesneler ise üzerinde döngü ile geçilebilenlerdir (örneğin, listeler, stringler, sözlükler). Bunların hepsi bir iterator döndüren __iter__() metoduna sahiptir.
Kendi iteratorunuzu gerçekleştirmek için, __iter__() (self döndürür) ve __next__() (sonraki elemanı alma mantığını uygular) metodlarına sahip bir sınıf oluşturmanız gerekir:
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
Iterable nesneler ile iteratorlar arasındaki fark nedir? Iterator üzerinde birden fazla kez geçilebilir mi?
Cevap: Iterable nesne sadece bir iterator döndüren __iter__() metodunu uygular. Iterator — __next__() metoduna sahip bir nesnedir. Iterator genellikle yalnızca bir kez döngüye alınır: dizinin sonuna ulaştıktan sonra tekrar iterasyona geçebilmek için yeni bir iterator oluşturmanız gerekir.
Hikaye
Log analizi için bir projede geliştirici, bir iterator alan ve iki kez onun üzerinden geçmeye çalışan bir fonksiyon yazdı (
for log in logs:). İki geçişin de aynı sonuçları vereceğini bekliyordu. İkinci iterasyon hiçbir şey döndürmedi çünkü iterator "tükenmişti".
Hikaye
Bir modülde geliştirici bir fonksiyondan liste değil, yalnızca bir kez iterasyon yapılabilen bir jeneratör döndürdü. Bunu birden fazla geçiş bekleyen başka bir fonksiyona vermeye çalıştığında, beklenmedik bir hata ve boş bir sonuç oluştu.
Hikaye
Web API projesinde geliştirici bir iteratoru doğrudan JSON'a serileştirmeye çalıştı. Iteratorlar listeler değildir ve listeye dönüştürülmeden dönüşüm mümkün değildir (aksi takdirde serileştirme bir istisna ile sonuçlanır).