Iteratorların Oluşturulması ve Kullanılması
Bu konuda iteratorları oluşturmayı, kullanmayı ve kendi objelerimizi iterable (üzerinde gezinilebilecek) olarak nasıl yazarız öğrenmeye çalışacağız. İlk olarak iteratorlar nedir anlamaya çalışalım
Iteratorlar nedir?
Iteratorlar aslında Pythonda çoğu yerde biz görmesek de kullanılır. Iteratorlar özellikle for döngülerinde , list comprehensionlarında, ve bir sonraki derste göreceğimiz generatorlarda karşımıza çıkar.
Iteratorlar en genel anlamıyla üzerinde gezinilebilecek bir objedir ve bu obje her seferinde bir tane eleman döner.
Pythonda kendisinden iterator oluşturabileceğimiz her obje iterable bir objedir.. Örneğin, demetlerden,listelerden ve stringlerden oluşturduğumuz bütün objeler iterable bir objedir.
Bir iterator objesini , iterable bir objeden (liste,demet,string vs) oluşturmak için Pythonda iter() fonksiyonunu kullanıyoruz ve bu objenin bir sonraki elemanını almak için next() fonksiyonu kullanıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
liste = [1,2,3,4,5] print(dir(liste)) # __iter__ metodu tanımlı olduğu için listeler üzerinde iterator oluşturabiliriz. """ Çıktı ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] """ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
iterator = iter(liste) # Iterator oluşturma print(next(iterator)) # next metoduyla sıradaki eleman print(next(iterator)) # next metoduyla sıradaki eleman print(next(iterator)) # next metoduyla sıradaki eleman print(next(iterator)) # next metoduyla sıradaki eleman print(next(iterator)) # next metoduyla sıradaki eleman """ Çıktı 1 2 3 4 5 """ |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
print(next(iterator)) # Eleman kalmadığı için "StopIteration" hatası """ Çıktı --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-75-9aa5c89bf87c> in <module>() ----> 1 next(iterator) # Eleman kalmadığı için "StopIteration" hatası StopIteration: """ |
İşte iterable bir objeden bir iterator’ı bu şekilde oluşturup, next() fonksiyonuyla objenin sıradaki elemanını alabiliyoruz. Ancak eleman kalmayınca StopIterationhatasını alıyoruz. İşte iteratorların kullanımı bu şekildedir. Aslında biz farketmesek de Pythondaki for döngüleri aslında bir objenin üzerinde gezinirken iteratorları kullanır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
liste = [1,2,3,4,5] for i in liste: print(i) """ Çıktı 1 2 3 4 5 """ |
Aslında for döngülerinin iç yapısı şu şekildedir;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
liste = [1,2,3,4,5] iterator = iter(liste) while True: try: print(next(iterator)) except StopIteration: break """ Çıktı 1 2 3 4 5 """ |
Kendi Iterable Objelerimizi Oluşturmak
Peki biz kendi oluşturduğumuz veritiplerini nasıl iterable yapacağız ? Bunun için oluşturacağımız sınıfların mutlaka __iter()__ ve __next()__ metodlarını tanımlaması gereklidir. Şimdi bir tane kumanda sınıfı oluşturalım ve bu sınıfı iterable yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Kumanda(): def __init__(self,kanal_listesi): self.kanal_listesi = kanal_listesi # Kanal Listemiz self.index = -1 # İndeksimiz def __iter__(self): return self # iterator oluşturduğumuzda (iter fonksiyonu çağrıldığında )objemizi döneceğiz. def __next__(self): # next fonksiyonu çağrıldığında burası çalışacak. self.index += 1 if (self.index < len(self.kanal_listesi)): return self.kanal_listesi[self.index] else: self.index = -1 raise StopIteration |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
kumanda = Kumanda(["Kanal d","Trt","Atv","Fox","Bloomberg"]) # Objemizi oluşturuyoruz. iterator = iter(kumanda) # Objemiz iterable olduğu için iterator oluşturulabilir. print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator)) """ Çıktı 'Kanal d' 'Trt' 'Atv' 'Fox' 'Bloomberg' """ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
print(next(iterator)) """ Çıktı --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-87-3733e97f93d6> in <module>() ----> 1 next(iterator) <ipython-input-78-369bc7ea5e2a> in __next__(self) 12 else: 13 self.index = -1 ---> 14 raise StopIteration StopIteration: """ |
Güzel ! Objemizi iterable yapmayı başardık. Objemiz iterable olduğuna göre artık for döngüsüyle üzerinde gezinebiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
for i in kumanda: print(i) """ Çıktı Kanal d Trt Atv Fox Bloomberg """ |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
for i in kumanda: print(i) """ Çıktı Kanal d Trt Atv Fox Bloomberg """ |
İşte Pythonda iteratorların kullanımı bu şekilde ! Artık iterator kullanmayı ve kendi objelerimizi iterable yapmayı biliyoruz.
sildenafil citrate coupon
sildenafil citrate coupon