Klient yalnız iteratorla işləyir, kolleksiyanın quruluşunu bilmir
Klient yalnız iteratorla işləyir, kolleksiyanın quruluşunu bilmir

Ideya

Iterator kolleksiyanın elementlərini onun daxili quruluşunu (massiv, əlaqəli siyahı, ağac, qraf) açmadan ardıcıl verir. Klient yalnız "növbəti element var?" və "onu ver" suallarını verir. Üstünlüklər: bir kolleksiyanı müxtəlif qaydada gəzmək olar, eyni anda bir neçə gəzinti bir-birinə mane olmur, kolleksiyanın içini dəyişsəniz klient kodu dəyişmir.

Python-da protokol

Python-da pattern dilin özünə daxil edilib: iterable __iter__() metodu ilə iterator qaytarır, iterator isə __next__() ilə növbəti elementi verir və bitəndə StopIteration qaldırır. for, list(), sum(), in hamısı bu protokolla işləyir. Ətraflı: iterasiya protokolu.

python
class Countdown:
    def __init__(self, start):
        self.current = start

    def __iter__(self):
        return self

    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        self.current -= 1
        return self.current + 1

for n in Countdown(3):
    print(n)
it = Countdown(2)
print(next(it), next(it))
print(list(it))