ProgramlamaBackend geliştirici

Python'da iteratorlerin çalışma şeklini anlatın. Kendi iteratorunuzu nasıl gerçekleştirebilirsiniz? Iteratorlar ile iterable nesneler arasındaki fark nedir?

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

Cevap.

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

Kandırmaca Sorusu.

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.

Konunun inceliklerini bilmeyenlerin başına gelen gerçek hata örnekleri.


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).