Python’da İteratörler (Python Iterators)

İteratörler ve iterable’lar, Python programlamasında oldukça önemli kavramlardır. Bu yazıda, iteratörlerin ne olduğunu, iterable’ların ne anlama geldiğini ve nasıl kendi iteratör sınıflarımızı oluşturabileceğimizi öğreneceğiz.
İteratör Nedir?
İteratör, Python’da bir dizi elemanı sırayla dolaşmamızı sağlayan bir nesnedir. Bir sonraki elemana geçişi takip eden bir durum bilgisi içerir. Bu sayede büyük veri koleksiyonları gibi elemanları tek tek işleyebiliriz. İteratör kelime olarak yineleyici anlamına gelmektedir. (Elemanları dolaşma sırasında adımlama işini gerçekleştiren nesnedir.)
İterable Nedir?
İterable, üzerinde iterasyon (döngü) yapılabilen herhangi bir nesneyi ifade eder. Liste, demet, sözlük gibi veri tipleri, stringler ve hatta dosya gibi bazı özel nesneler iterable olarak örnek gösterilebilir. (Adımlama işini yapabildiğimiz nesnelerdir.)
İteration Nedir?
İteration, basitçe bir iterable içindeki elemanları sırayla dolaşma işlemidir. Bu, genellikle for döngüsü veya while döngüsü kullanılarak gerçekleştirilir. Her adımda, iteratör nesnesi bir sonraki elemana geçiş yapar. (Adımlama işlemidir.)
Örnek:
İterable nesneler, programlama dilinde verileri etkili bir şekilde işlemek için kullanılır. Özellikle döngülerde ve liste benzeri yapıları eleman eleman dolaşmak için büyük kolaylık sağlarlar.
my_list = [1, 2, 3, 4, 5]
for item in my_list:
print(item)
Yukarıdaki örnekte, my_list adlı liste iterable bir nesnedir ve for döngüsü kullanılarak her bir elemanı sırayla dolaşılarak ekrana yazdırılır. Bu, iterable nesnelerin, verileri düzenli bir şekilde işlemek için ne kadar kullanışlı olduğunu gösterir.
Bir Değişkenin İterable Olup Olmadığını Nasıl Anlarız?
Bir değişkenin iterable olup olmadığını anlamak için “dir” metodunu aşağıdaki gibi kullanabiliriz. Bu metod değişkene ait kullanabileceğimiz metodların listesini verir. Bu metodların içerisinde “__iter__” metodu bulunmalıdır. Örnek olarak bir liste değişkeninin metodları içerisinde “__iter__” metodunu göreceğiz.
print(dir(my_list))
Sonuç --->
['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__'a3', 'kup, '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclas, 'kupaj's__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed_a9', 'maç_', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
Sonuç —> ………..”__iter__”
Bahsettiğimiz “__iter__” metodu bize bir iteratör verir(İteratör döndürür). İteratörlerin en büyün özelliği ise içerisinde “__next__” metodunu barındırmasıdır.
print(dir(my_list.__iter__())) Sonuç ---> ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__haa3', 'kupsh__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', 'kupaj', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']
Kendi Sınıfımız Üzerinde Nasıl İteratör Oluşturabiliriz?
Kendi sınıfımızı iterable hale getirmek için __iter__() ve __next__() adlı özel metodları tanımlamamız gerekir. __iter__() metodu iteratör elde edeceğiz ve bu iteratörün __next__() metodunu kullanarak bir sonraki elemana geçiş sağlayabileceğiz.
Not : __next__() metodu iterasyonun(adımlamanın) sonuna gelindiğinde StopIteration hatası dödürür.
class Range:
def __init__(self, baslangic, bitis):
self.baslangic = baslangic
self.bitis = bitis
def __iter__(self):
return self
def __next__(self):
if self.baslangic <= self.bitis:
sayi = self.baslangic
self.baslangic += 1
return sayi
else:
raise StopIteration
# Kullanım
sayilar = Range(5,10)
for sayi in sayilar:
print(sayi)
Yukarıdaki kodun kullanımı kısmında for döngüsünü kullanabiliyoruz çünkü fonksiyon içerisinde iter ve next motedlarını tanımladık. For döngüsü aslında kendi içerisinde next metodunu kullanmakta ve “StopIteration” hatasına geldiğinde durmaktadır.
Sonuç
İteratörler konusu bilmek kendi oluşturduğumuz sınıf yapılarına bu özelliği neden kazandırmamız gerektiğini ve nasıl kazandırabileceğimizi bize gösterir. Bu yazıda, Python’da iteratörlerin ve iterable’ların nasıl çalıştığını öğrendik. Ayrıca kendi iterable sınıflarımızı nasıl oluşturabileceğimizi ve bir nesnenin iterable olup olmadığını nasıl kontrol edebileceğimizi de gördük. Bu kavramlar, veri işleme ve döngülerde daha etkili ve esnek kod yazmamıza olanak tanır.
Umarım bu yazı, iteratörler hakkındaki anlayışınızı artırmış ve Python programlamanızı daha da güçlendirmiştir. İyi kodlamalar!