Python iterators (yineleyiciler) kendi kendi çağırarak bir methodun ilerlemesi olarak düşüne biliriz.
Kullanıdığız herhangi bir nesnede __iter__ magic metodu tanımlıysa bu method iterators olarak çalıştırılabilir. Tabi isterseniz
kendinizde bir iterators oluşturabilirsiniz. Bu zamana koda kullanmış olduğumuz for i in liste:
yapıları bir iterators
yapısıdır. Burada for nesneyi iterator yaparak tek tek ilerlemektedir.
1 2 3 4 5 6 7 8 9 10 | <p>Yine daha detaylı bilgi için <a href="https://python.org">python.org</a>'a bakabilirsiniz.</p> liste =["Necip","Fazıl","Kısakürek"] for i in liste: print(i) #Ekran Çıktısı #Necip #Fazıl #Kısakürek |
Anlaşıldığı gibi liste veriyi döngüye for döngüsüne sokarak sıralı bir şekilde çalışmasını sağoladı. İter olmasaydı bunlar sıralı olarak gelmeyeceklerdi. Bu sebepten aşağıdaki gibi yazmamız gerekecekti.
1 2 3 4 5 6 7 8 9 10 | liste =["Necip","Fazıl","Kısakürek"] sayac = 0 while sayac < len(liste): print(liste[sayac]) sayac+=1 # Ekran Çıktısı # Necip # Fazıl # Kısakürek |
Evet şimdi bu iter yapısını kendimiz for olmadan kuralım ve çalıştıralım.
1 2 3 4 5 6 7 8 9 10 11 | liste =["Necip","Fazıl","Kısakürek"] yineleyici = iter(liste) print(next(yineleyici)) print(next(yineleyici)) print(next(yineleyici)) # Ekran Çıktısı # Necip # Fazıl # Kısakürek |
Burada python iter()
fonksiyonunu kullanarak yenelenebilir bir hale getirdik ve kaç
tane eleman varsa next(yineleyici)
ile sıralı bir şekilde ilerleyerek yazdırdık. Bunu isterseniz tuple
içinde kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 | liste =("Necip","Fazıl","Kısakürek") yineleyici = iter(liste) print(next(yineleyici)) print(next(yineleyici)) print(next(yineleyici)) # Ekran Çıktısı # Necip # Fazıl # Kısakürek |
Eğer üç elemanlı bir liste dördüncü next()
fonksiyonunu kullanırsanız StopIteration
hatası alırsınız.
Tabi bizler ve for döngüsü liste elamanı içerisinde ne kadar veri olduğunu bilmiyor. for bu nesneyi iter
yaptıktan sonra StopIteration
hatası alana kadar ilerliyor. Hata geldikten sonra ise yineleme
işlemi son buluyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | liste =("Necip","Fazıl","Kısakürek") # Listemizi oluşturduk. yinele = iter(liste) #iteration hale getirdik while True: # sonsuz döngü oluşturduk try: # Hata ayıklamayı başlattık print(next(yinele)) #next metodu ile son elamana kadar yeineleyerek ekrana bastık. except StopIteration: #Son elemandan sonra StopIteration hatası aldık break #Hata alındıktan sonra sonsuz döngüyü kırdık. # Ekran Çıktısı # Necip # Fazıl # Kısakürek |
Burada tam olarak for döngüsünün çalışma matığını while ile tamamladık.
Şimdi isterseniz bunu bir class haline getirelim range()
fonksiyonu gibi bize iki değer arasında sayı üretsin.
Tabi burada nesne tabalı programlada kullanmış olduğumuz magic(Sihirli) metholar ile yapacağız.
Burada iter yapısınız __iter__
ve <__next__
ile yapacağız.
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 | class myIter: def __init__(self,data): #Class oluşturulurken bir verinin alınacağı parametreyi oluşturduk self.veri = data # sını içinde kullanmak için data'yi veri adında değişkene aktardık self.sayac= 0 # Sıralı bir şekilde yazdırmak için bir sayaç oluşturduk. def __iter__(self): return self # Classımızı iteration(Yinelenebilir) hale getirdik def __next__(self): if self.sayac < len(self.veri): #sayac veri içerisindeki değerden küçük olduğu sürece çalışacak deger = self.veri[self.sayac] # Sıradaki değeri bir değişkene aldık self.sayac+=1 # bir sonraki değer için sayacımızı bir artırdık return deger # almış olduğumuz değer geri ilettik else: raise StopIteration # Sayac veri adetini bulduğunuda StopIteration hatası veridik liste =("Necip","Fazıl","Kısakürek") # verimizi oluşturduk data = myIter(liste) # Nesnemizi iteration hale getirdik print(next(data)) # Sıradaki elaman print(next(data)) # Sıradaki elaman print(next(data)) # Sıradaki elaman #print(next(data)) # eğer bu komut satırını çalıştırırsanız else çalışarak StopItration hatası alırsınız # Ekran Çıktısı # Necip # Fazıl # Kısakürek |
Burada iter yapısını nesne tabanlı programlama ile yaptık isterseniz kendi nesnelerinizede iter yapısını getirebilirsiniz. Aynız zamanda yukarıdaki yapmış olduğumuz yapıyı aşağdaki gibi for döngüsü ilede kurabilirsiniz.
1 2 3 4 5 6 7 8 9 | liste =["Necip","Fazıl","Kısakürek"] # verimizi oluşturduk for i in myIter(liste): print(i) # Ekran Çıktısı # Necip # Fazıl # Kısakürek |