#!/usr/bin/env python # coding: utf-8 # # 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 objenin **iterable** olması için hazır metodlar olan \__iter()\__ ve \__next()\__ metodlarını mutlaka tanımlaması gerekir. # ### Iterator oluşturma # # 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. # In[61]: liste = [1,2,3,4,5] # In[64]: dir(liste) # __iter__ metodu tanımlı olduğu için listeler üzerinde iterator oluşturabiliriz. # In[68]: iterator = iter(liste) # Iterator oluşturma # In[69]: next(iterator) # next metoduyla sıradaki eleman # In[70]: next(iterator) # next metoduyla sıradaki eleman # In[71]: next(iterator) # next metoduyla sıradaki eleman # In[72]: next(iterator) # In[73]: next(iterator) # In[75]: next(iterator) # Eleman kalmadığı için "StopIteration" hatası # İş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. # In[76]: liste = [1,2,3,4,5] for i in liste: print(i) # Aslında **for döngülerinin** iç yapısı şu şekildedir; # # In[77]: liste = [1,2,3,4,5] iterator = iter(liste) while True: try: print(next(iterator)) except StopIteration: break # ### 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. # In[78]: 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 # In[80]: kumanda = Kumanda(["Kanal d","Trt","Atv","Fox","Bloomberg"]) # Objemizi oluşturuyoruz. # In[81]: iterator = iter(kumanda) # Objemiz iterable olduğu için iterator oluşturulabilir. # In[82]: next(iterator) # In[83]: next(iterator) # In[84]: next(iterator) # In[85]: next(iterator) # In[86]: next(iterator) # In[87]: next(iterator) # Güzel ! Objemizi **iterable** yapmayı başardık. Objemiz **iterable** olduğuna göre artık **for** döngüsüyle üzerinde gezinebiliriz. # In[88]: for i in kumanda: print(i) # In[89]: for i in kumanda: print(i) # İşte Pythonda iteratorların kullanımı bu şekilde ! Artık iterator kullanmayı ve kendi objelerimizi **iterable** yapmayı biliyoruz. # In[ ]: