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 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 objenin iterable olması için hazır metodlar olan __iter()__ ve __next()__ metodlarını mutlaka tanımlaması gerekir.
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.
liste = [1,2,3,4,5]
dir(liste) # __iter__ metodu tanımlı olduğu için listeler üzerinde iterator oluşturabiliriz.
['__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']
iterator = iter(liste) # Iterator oluşturma
next(iterator) # next metoduyla sıradaki eleman
1
next(iterator) # next metoduyla sıradaki eleman
2
next(iterator) # next metoduyla sıradaki eleman
3
next(iterator)
4
next(iterator)
5
next(iterator) # Eleman kalmadığı için "StopIteration" hatası
--------------------------------------------------------------------------- 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 StopIteration hatası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.
liste = [1,2,3,4,5]
for i in liste:
print(i)
1 2 3 4 5
Aslında for döngülerinin iç yapısı şu şekildedir;
liste = [1,2,3,4,5]
iterator = iter(liste)
while True:
try:
print(next(iterator))
except StopIteration:
break
1 2 3 4 5
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.
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
kumanda = Kumanda(["Kanal d","Trt","Atv","Fox","Bloomberg"]) # Objemizi oluşturuyoruz.
iterator = iter(kumanda) # Objemiz iterable olduğu için iterator oluşturulabilir.
next(iterator)
'Kanal d'
next(iterator)
'Trt'
next(iterator)
'Atv'
next(iterator)
'Fox'
next(iterator)
'Bloomberg'
next(iterator)
--------------------------------------------------------------------------- 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.
for i in kumanda:
print(i)
Kanal d Trt Atv Fox Bloomberg
for i in kumanda:
print(i)
Kanal d Trt Atv Fox Bloomberg
İşte Pythonda iteratorların kullanımı bu şekilde ! Artık iterator kullanmayı ve kendi objelerimizi iterable yapmayı biliyoruz.