Iterator

Kategori: Python , 07 Eylül 2019 , JanFranco


Bu yazımda iterator'lardan bahsedeceğim. Iterator'lar gezinme araçlarıdır. Bir liste tanımladığımızda ve bu listede for döngüsü ile gezindiğimizde arka planda bir iterator çalışır. Şimdi bir liste tanımlayalım ve for döngüsü ile listede gezinelim. Daha sonra iterator kullanarak, for döngüsü olmadan listede gezinelim:


list_1 = range(10, 100, 10)

for i in list_1:
    print(i)
>>
10
20
30
40
50
60
70
80
90
Aynı işi iterator ile yapalım. Bunun için iter() ve next() fonksiyonlarını kullanacağız:


iterator = iter(list_1)

while True:
    try:
        print(next(iterator))
    except StopIteration:
        break
>>
10
20
30
40
50
60
70
80
90
Bir örnek daha yapalım:


list_2 = [1, 2, 3, 4, 5]

iterator = iter(list_2)

print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
>>
1
2
3
4
5
iter() ve next() fonksiyonlarını kendi sınıflarımızda da kullanabilir, iterable objeler oluşturabiliriz:


class RemoteController:

    def __init__(self, channel_list):
        self.channel_list = channel_list
        self.index = -1

    def __iter__(self):
        return self

    def __next__(self):
        self.index += 1
        if self.index < len(self.channel_list):
            return self.channel_list[self.index]
        else:
            self.index = -1
            raise StopIteration
__next__ methodunu kendimize göre düzenlediğimiz takdirde, iterable objeler üretebiliriz:


rt = RemoteController(["Channel 1", "Channel 2", "Channel 3", "Channel 4", "Channel 5"])
iterator = iter(rt)

print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
>>
Channel 1
Channel 2
Channel 3
Channel 4
Channel 5
Sınıfımızda iter() ve next() methodları bulunduğundan, iterable obje ürettiğimizden dolayı for döngüsünü de kullanabiliriz:


for i in rt:
    print(i)
>>
>>
Channel 1
Channel 2
Channel 3
Channel 4
Channel 5
Başka bir örnek yapalım:


class Power:

    def __init__(self, maximum=0):
        self.maximum = maximum
        self.power = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.power <= self.maximum:
            res = 3 ** self.power
            self.power += 1
            return res
        else:
            self.power = 0
            raise StopIteration


power = Power(6)

for i in power:
    print(i)
>>
1
3
9
27
81
243
729


Sonraki Yazı: Generators, yield
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın