Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
1 beğenilme 0 beğenilmeme
1.4k kez görüntülendi
Sıradaki gelsin denilebilen obje tipi nedir?
Veri Bilimi kategorisinde (3.7k puan) tarafından  | 1.4k kez görüntülendi

1 cevap

2 beğenilme 0 beğenilmeme

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)
    

 

(77 puan) tarafından 
tarafından düzenlendi
20,281 soru
21,818 cevap
73,492 yorum
2,496,168 kullanıcı