Iteratory Pythona
Iteratory Pythona
Iterator to obiekt, który zawiera policzalną liczbę wartości.
Iterator to obiekt, po którym można iterować, co oznacza, że można przejść przez wszystkie wartości.
Technicznie rzecz biorąc, w Pythonie iterator to obiekt, który implementuje protokół iteratora, który składa się z metod __iter__()
i __next__()
.
Iterator a iterowalny
Listy, krotki, słowniki i zestawy to wszystkie obiekty iterowalne. Są to kontenery iterowalne , z których można uzyskać iterator.
Wszystkie te obiekty mają iter()
metodę, która służy do uzyskania iteratora:
Przykład
Zwróć iterator z krotki i wypisz każdą wartość:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Nawet łańcuchy są obiektami iterowalnymi i mogą zwracać iterator:
Przykład
Łańcuchy to również obiekty iterowalne, zawierające sekwencję znaków:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
Pętla przez iterator
Możemy również użyć for
pętli do iteracji przez obiekt iterowalny:
Przykład
Powtórz wartości krotki:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
Przykład
Powtórz znaki ciągu:
mystr = "banana"
for x in mystr:
print(x)
Pętla for
faktycznie tworzy obiekt iteratora i wykonuje metodę next() dla każdej pętli.
Utwórz iterator
Aby stworzyć obiekt/klasę jako iterator, musisz zaimplementować metody
__iter__()
i
__next__()
do swojego obiektu.
Jak dowiedziałeś się w rozdziale Klasy/Obiekty Pythona , wszystkie klasy mają funkcję o nazwie
__init__()
, która umożliwia inicjalizację podczas tworzenia obiektu.
Metoda __iter__()
działa podobnie, możesz wykonywać operacje (inicjowanie itp.), ale zawsze musi zwracać sam obiekt iteratora.
Metoda __next__()
pozwala również na wykonywanie operacji i musi zwrócić następny element w sekwencji.
Przykład
Utwórz iterator, który zwraca liczby, zaczynając od 1, a każda sekwencja zwiększy się o jeden (zwracając 1,2,3,4,5 itd.):
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
StopIteracja
Powyższy przykład byłby kontynuowany w nieskończoność, jeśli masz wystarczająco dużo instrukcji next() lub jeśli został użyty w
for
pętli.
Aby zapobiec ciągnięciu się iteracji w nieskończoność, możemy użyć
StopIteration
instrukcji.
W __next__()
metodzie możemy dodać warunek kończący, aby zgłosić błąd, jeśli iteracja zostanie wykonana określoną liczbę razy:
Przykład
Zatrzymaj się po 20 iteracjach:
class MyNumbers:
def __iter__(self):
self.a =
1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass =
MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)