Python Yineleyicileri (__iter__ ve __next__): Nasıl Kullanılır ve Neden?

Yineleyiciler, üzerinde yinelenebilen nesnelerdir. Bu eğiticide, yineleyicinin nasıl çalıştığını ve __iter__ ve __next__ yöntemlerini kullanarak kendi yineleyicinizi nasıl oluşturabileceğinizi öğreneceksiniz.

Video: Python Yineleyicileri

Python'da yineleyiciler

Yineleyiciler Python'da her yerdedir. forDöngüler, kavrayışlar, üreteçler vb. İçinde zarif bir şekilde uygulanırlar , ancak açıkta gizlidirler.

Python'daki yineleyici, üzerinde yinelenebilen bir nesnedir. Her seferinde bir öğe olmak üzere veri döndürecek bir nesne.

Teknik olarak konuşursak, bir Python yineleyici nesnesi iki özel yöntem uygulamalıdır __iter__()ve __next__()topluca yineleme protokolü olarak adlandırılır .

Bir nesneden bir yineleyici alabilirsek , nesneye yinelenebilir denir . Python'daki list, tuple, string vb. Gibi çoğu yerleşik konteyner yinelenebilirdir.

iter()Fonksiyonu (ki bu da çağıran __iter__()yöntemi) 'ü bir yineleyici döndürür.

Yineleyici ile Yineleme

next()Bir yineleyicinin tüm öğelerini manuel olarak yinelemek için işlevi kullanırız . Sona ulaştığımızda ve döndürülecek daha fazla veri kalmadığında, StopIterationİstisnayı artıracaktır . Aşağıda bir örnek verilmiştir.

 # define a list my_list = (4, 7, 0, 3) # get an iterator using iter() my_iter = iter(my_list) # iterate through it using next() # Output: 4 print(next(my_iter)) # Output: 7 print(next(my_iter)) # next(obj) is same as obj.__next__() # Output: 0 print(my_iter.__next__()) # Output: 3 print(my_iter.__next__()) # This will raise error, no items left next(my_iter)

Çıktı

 4 7 0 3 Traceback (en son çağrı son): Dosya "", satır 24, sonraki (my_iter) StopIteration

Otomatik olarak yinelemenin daha zarif bir yolu, for döngüsünü kullanmaktır. Bunu kullanarak, bir yineleyici döndürebilen herhangi bir nesneyi yineleyebiliriz, örneğin liste, dizgi, dosya vb.

 >>> for element in my_list:… print(element)… 4 7 0 3

Yineleyiciler için for döngüsünün çalışması

Yukarıdaki örnekte gördüğümüz gibi, fordöngü liste boyunca otomatik olarak yinelenebildi.

Aslında fordöngü herhangi bir yinelenebilir üzerinde yinelenebilir. forDöngünün Python'da gerçekte nasıl uygulandığına daha yakından bakalım .

 for element in iterable: # do something with element

Aslında olarak uygulanmaktadır.

 # create an iterator object from that iterable iter_obj = iter(iterable) # infinite loop while True: try: # get the next item element = next(iter_obj) # do something with element except StopIteration: # if StopIteration is raised, break from loop break

Yani dahili olarak fordöngü , yinelenebilir olanı iter_objçağırarak bir yineleyici nesne oluşturur iter().

İronik olarak, bu fordöngü aslında sonsuz bir döngüdür.

Döngünün içinde, bir next()sonraki elemanı almayı çağırır ve fordöngünün gövdesini bu değerle yürütür . Tüm öğeler tükendikten sonra StopIteration, içeriden yakalanan ve döngü sona eren kaldırılır. Diğer herhangi bir istisnanın geçeceğini unutmayın.

Özel Yineleyiciler Oluşturma

Python'da sıfırdan bir yineleyici oluşturmak kolaydır. Sadece __iter__()ve __next__()yöntemlerini uygulamalıyız.

__iter__()Yöntem, yineleyici nesneyi döndürür. Gerekirse bazı başlatma işlemleri gerçekleştirilebilir.

__next__()Yöntem sırayla sonraki öğeyi geri dönmelidir. Sona ulaşıldığında ve sonraki çağrılarda yükseltmesi gerekir StopIteration.

Burada, bize her yinelemede 2'nin bir sonraki gücünü verecek bir örnek gösteriyoruz. Kuvvet üssü sıfırdan bir kullanıcı ayarlı sayıya kadar başlar.

Nesne yönelimli programlama hakkında herhangi bir fikriniz yoksa, Python Nesne Yönelimli Programlama'yı ziyaret edin.

 class PowTwo: """Class to implement an iterator of powers of two""" def __init__(self, max=0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration # create an object numbers = PowTwo(3) # create an iterable from the object i = iter(numbers) # Using next to get to the next iterator element print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i))

Çıktı

 1 2 4 8 Traceback (en son çağrı): Dosya "/home/bsoyuj/Desktop/Untitled-1.py", satır 32, baskıda (sonraki (i)) Dosya "", satır 18, __next__ 'de StopIteration'ı yükseltin StopIteration

forYineleyici sınıfımızı yinelemek için bir döngü de kullanabiliriz .

 >>> for i in PowTwo(5):… print(i)… 1 2 4 8 16 32

Python Sonsuz Yineleyiciler

Bir yineleyici nesnesindeki öğenin tüketilmesi gerekli değildir. Sonsuz yineleyiciler olabilir (hiç bitmeyen). Bu tür yineleyicilerle uğraşırken dikkatli olmalıyız.

İşte sonsuz yineleyicileri göstermek için basit bir örnek.

Yerleşik işlev iter()işlevi, ilk bağımsız değişkenin çağrılabilir bir nesne (işlev) ve ikincisi ise sentinel olduğu iki bağımsız değişkenle çağrılabilir. Yineleyici, döndürülen değer sentinele eşit olana kadar bu işlevi çağırır.

 >>> int() 0 >>> inf = iter(int,1) >>> next(inf) 0 >>> next(inf) 0

int()İşlevin her zaman 0 döndürdüğünü görebiliriz. Dolayısıyla, onu olduğu gibi iter(int,1)geçirmek int(), döndürülen değer 1'e eşit olana kadar çağıran bir yineleyici döndürür . Bu asla olmaz ve sonsuz bir yineleyici elde ederiz.

Ayrıca kendi sonsuz yineleyicilerimizi de oluşturabiliriz. Aşağıdaki yineleyici teorik olarak tüm tek sayıları döndürecektir.

 class InfIter: """Infinite iterator to return all odd numbers""" def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num

Örnek bir çalışma aşağıdaki gibi olacaktır.

 >>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7

Ve benzeri…

Bu tür sonsuz yineleyiciler üzerinde yineleme yaparken, bir sonlandırma koşulu eklemeye dikkat edin.

Yineleyicileri kullanmanın avantajı, kaynakları korumalarıdır. Yukarıda gösterildiği gibi, tüm sayı sistemini belleğe kaydetmeden tüm tek sayıları alabiliriz. Sonlu bellekte (teorik olarak) sonsuz öğelere sahip olabiliriz.

Python'da yineleyiciler oluşturmanın daha kolay bir yolu var. Daha fazla bilgi edinmek için: Getiri kullanan Python jeneratörlerini ziyaret edin.

Ilginç makaleler...