iter() fonksiyonu İtere edilebilme(üzerinde gezilebilecek) yetisine sahip bir objeyi itere edilebilir bir objeye dönüştürür/yaratır . İtere edilebilir obje ise next() fonksiyonu ile itere edilir. Örneğin list(liste) objesi itere edilebilirken int(tam sayı) objesi itere edilemez . Çünkü list objesi belli bir sıraya sahipken int objesi böyle bir özelliğe sahip değildir . En basitinden iter() ve next() fonksiyonları for döngüsünün temel çalışma prensipidir. Eğer for döngüsüne itere edilebilir bir obje verirseniz (örn : list,tuple,dict...) döngü ilk başta verilen objeyi itere edilebilir bir hale getirir daha sonra ise her döngü bitişinde ise next() fonksiyonu ile bir sonraki adıma geçer . En sonda ise StopIteration ile döngü biter.
__iter__() ise genellikle sınıflarda(obje) karşımızda çıkar . Tanımlandığı sınıfta(objede) itere edilebilme yetisini kazandırır. Yalnız itere edilme yetisini kazanan sınıfta bir sonraki iterasyona geçilebilmesi için __next__() de tanımlı olması gerekir. Örneğin oluşturduğunuz bir sınıfı(objenin) for döngüsünde kullanmak için bunu kullanabilirsiniz .
__iter__() ve __next__() fonksiyonlarının örnek kullanımı :
class fibonacci:
def __init__(self, n:int):
self.n = n # fibonaccinin maksimum indisi, parametre olarak alınır
def __iter__(self):
self.counter = 0 #iterasyonun ölçülmesi için sayaç değişkeni
return self
def __next__(self):
self.counter += 1 # sayaç arttırılırç
if(self.counter > self.n):#eğer sayaç n'den büyük ise iterasyon hatası verir.
raise StopIteration
return self.fib(self.counter) # fibonacci'nin iterasyondaki değeri verilir
def fib(self,n): # fibonacci dizisinin n'inci değerini veren fonksiyon
if (n == 1) or (n == 2):
return 1
elif n > 2 :
return self.fib(n-1) + self.fib(n-2)
else:# Negatif değer girilirse
raise ValueError("Error")
mesela şöyle bir sınıfımız(objemiz) olsun. Bu sınıfı şu şekillerde kullanabiliriz :
if __name__ == "__main__":
fib_class = fibonacci(5) #max indis : 5
iter_fib = iter(fib_class) #itere edilebilir hale getirilir.
print(next(iter_fib)) # -> 1
print(next(iter_fib)) # -> 1
print(next(iter_fib)) # -> 2
print(next(iter_fib)) # -> 3
print(next(iter_fib)) # -> 5
print(next(iter_fib)) # -> StopIteration hatası, çünkü iterasyon bitti.
iter_fib = iter(fib_class) #şu şekilde yeniden tanımlanarak iterasyon başa sarılabilir.
#veya şu şekilde kullanabiliriz
for i in iter_fib:
print(i)