Iterator
Yineleyici
- Okunuşu
- itıreytır
Kısaca
Iterator, verinin nasıl saklandığını açığa çıkarmadan, konumunu hatırlayarak bir koleksiyonun öğeleri arasında teker teker ilerlemeyi sağlayan bir nesnedir.
Iterator nedir?
Iterator, bir dizinin öğelerini tek tek üreten bir nesnedir. Her sonraki öğeyi istediğinizde o öğeyi döndürür ve ilerler; hiçbir şey kalmadığında bittiğini bildirir. JavaScript'teki for...of döngüleri, Python'daki for döngüleri ile C# ve Java'daki foreach döngüleri koleksiyonlar üzerinde iterator'lar aracılığıyla gezinir.
Çoğu dil bunun için küçük bir protokol tanımlar. Python'da iterable, bir iterator döndüren __iter__ metoduna sahip her şeydir ve iterator'ın __next__ metodu, StopIteration hatası verene dek öğeleri döndürür. JavaScript'te bir iterator'ın next() metodu { value: 1, done: false } gibi nesneler döndürür; Java ve Rust'ta da benzer Iterator interface'leri vardır. Öğeler talep üzerine üretildiği için iterator'lar her şeyi belleğe yüklemeden büyük dosyalar, veritabanı sonuçları ve hatta sonsuz diziler üzerinde gezinebilir; yield ile yazılan üreteç (generator) fonksiyonlar bunları oluşturmanın elverişli bir yoludur.
Iterator, bir kitapta ilerleyen bir yer imi gibidir: nerede olduğunuzu bilir, istediğinizde sonraki sayfayı verir ve kitabın karton kapaklı mı yoksa e-kitap mı olduğuyla ilgilenmez. Iterator tasarım deseninin ardındaki fikir budur; aynı döngü dizilerle, bağlı listelerle, ağaçlarla, kümelerle ya da akışla gelen verilerle çalışabilir, çünkü döngü yalnızca iterator ile konuşur, altındaki veri yapısıyla asla konuşmaz.
Iterator'lar sıklıkla iterable'larla karıştırılır. Iterable, bir liste gibi üzerinde dönülebilen koleksiyondur; iterator ise ondan oluşturulan ve geçerli konumu izleyen tek kullanımlık imleçtir. Bir liste üzerinde birçok kez dönebilirsiniz, ancak bir iterator genellikle tek geçişten sonra tükenir ve bu, onu yeniden kullanmaya çalışanları şaşırtır.
Önemli noktalar
- Iterator, öğeleri teker teker döndürür ve geçerli konumunu hatırlar.
- Iterable koleksiyondur; iterator ise ondan oluşturulan imleçtir.
for...ofve Python'ınfordöngüsü gibi döngüler arka planda iterator kullanır.- Iterator'lar öğeleri tembel (lazy) üretebilir; bu, çok büyük veya sonsuz dizileri destekler.
- Çoğu iterator tek geçişten sonra tükenir ve yeniden dönmek için yeniden oluşturulmalıdır.
Örnek
colors = ["red", "green", "blue"] # an iterable
it = iter(colors) # create an iterator from it
print(next(it)) # red
print(next(it)) # green
# A generator function produces a lazy iterator
def countdown(n):
while n > 0:
yield n
n -= 1
print(list(countdown(3))) # [3, 2, 1]Sık sorulan sorular
Iterator ile iterable arasındaki fark nedir?
Iterable, bir liste veya dize gibi üzerinde dönebileceğiniz bir şeydir. Iterator ise gerçekten adım atma işini yapan, her seferinde bir öğe döndüren ve nerede olduğunu izleyen nesnedir.
Iterator ile generator arasındaki fark nedir?
Generator, yield kullanan bir fonksiyon yazarak iterator oluşturmanın elverişli bir yoludur. Her generator bir iterator'dır, ancak iterator'lar yineleme protokolünü uygulayan sınıflar olarak elle de yazılabilir.
Bir iterator üzerinde neden iki kez dönemiyorum?
Iterator dahili bir konum tutar ve sona ulaştığında orada kalır. Yeniden dönmek için özgün koleksiyondan yeni bir iterator oluşturun.
İlgili sayfalar
- DöngüProgramlamanın Temelleri, s. 16Döngü, bir kod bloğunu belirli sayıda, bir koleksiyondaki her öğe için bir kez ya da bir koşul doğru kaldığı sürece tekrar eden bir kontrol yapısıdır.
- DiziProgramlamanın Temelleri, s. 15Dizi, tek bir ad altında saklanan ve her öğesine genellikle 0'dan başlayan indeks adlı sayısal konumuyla erişilen, sıralı bir değerler koleksiyonudur.
- Tasarım DeseniYazılım Mimarisi, s. 42Tasarım deseni, yazılım tasarımında sık görülen bir soruna kanıtlanmış, yeniden kullanılabilir çözümdür; hazır kod değil, genel bir şablon olarak anlatılır.
- Bağlı ListeVeri Yapıları, s. 4Bağlı liste, öğeleri ayrı düğümlerde saklayan bir veri yapısıdır; her düğüm bir değer ile zincirdeki sonraki düğüme bir referans tutar.
- InterfaceProgramlamanın Temelleri, s. 26Interface, bir türün sağlamayı vaat ettiği metot ve özellik imzalarından oluşan adlandırılmış bir kümedir; bu üyelerin nasıl gerçekleştirildiğini söylemez.
- GenericsProgramlamanın Temelleri, s. 23Generics, tam tür güvenliğini korurken birçok veri türüyle çalışan fonksiyonlar, sınıflar ve türler yazmanıza olanak tanıyan bir dil özelliğidir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin