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
def __iter__(self):
self.counter = 0
return self
def __next__(self):
self.counter += 1
if(self.counter > self.n):
raise StopIteration
return self.fib(self.counter)
def fib(self,n):
if (n == 1) or (n == 2):
return 1
elif n > 2 :
return self.fib(n-1) + self.fib(n-2)
else:
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)
iter_fib = iter(fib_class)
print(next(iter_fib))
print(next(iter_fib))
print(next(iter_fib))
print(next(iter_fib))
print(next(iter_fib))
print(next(iter_fib))
iter_fib = iter(fib_class)
for i in iter_fib:
print(i)