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. for
Dö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, for
döngü liste boyunca otomatik olarak yinelenebildi.
Aslında for
döngü herhangi bir yinelenebilir üzerinde yinelenebilir. for
Dö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 for
döngü , yinelenebilir olanı iter_obj
çağırarak bir yineleyici nesne oluşturur iter()
.
İronik olarak, bu for
döngü aslında sonsuz bir döngüdür.
Döngünün içinde, bir next()
sonraki elemanı almayı çağırır ve for
dö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
for
Yineleyici 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.