Iterator Python

Iterator Python

Iterator jest obiektem, który zawiera liczbową liczbę wartości.

Iterator jest obiektem iterowalnym, co oznacza, że można przechodzić przez wszystkie wartości.

Technicznie rzecz biorąc, w Pythonie iterator jest obiektem realizującym protokół iteratora, który zawiera metody __iter__() i __next__().

Iterator VS Obiekt Iterowalny (Iterable)

listy, krotki, słowniki i zbiorów są obiektami iterowalnymi. Są to kontenery iterowalne, z których można uzyskać iterator (Iterator).

Wszystkie te obiekty mają metodę do uzyskania iteratora iter() Metoda:

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))

Uruchom przykład

Nawet łańcuch znaków jest obiektem iterowalnym i może zwracać iterator:

Przykład

Łańcuch znaków jest również obiektem iterowalnym, zawierającym serię 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))

Uruchom przykład

Przechodzenie przez iterator

Możemy również używać pętli for do przechodzenia przez obiekty iterowalne:

Przykład

Iterowanie przez wartości krotek:

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
  print(x)

Uruchom przykład

Przykład

Iterowanie przez znaki w łańcuchu znaków:

mystr = "banana"
for x in mystr:
  print(x)

Uruchom przykład

Wskazówka:Petla for w rzeczywistości tworzy obiekt iteratora i wykona dla każdej iteracji next() metoda.

tworzenie iteratora

Aby utworzyć obiekt/klasę jako iterator, musisz zaimplementować __iter__() i __next__() metoda.

Jak nauczyłeś się w rozdziale o klasach i obiektach w Pythonie, wszystkie klasy mają metodę o nazwie __init__() Funkcja, która pozwala na wykonanie pewnych inicjalizacji podczas tworzenia obiektu.

__iter__() Metoda działa podobnie, możesz wykonywać operacje (inicjalizacja itp.), ale zawsze musisz zwrócić obiekt iteratora.

__next__() Metoda pozwala również na wykonywanie operacji i musi zwrócić następny element sekwencji.

Przykład

Stwórz iterator zwracający liczby, zaczynający od 1, zwiększający się o 1 w każdym ciągu (zwraca 1, 2, 3, 4, 5 itp.):

class MyNumbers:
  def __iter__(self):
    self.a = 1
    zwróć siebie
  def __next__(self):
    x = self.a
    self.a += 1
    zwróć x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

Uruchom przykład

StopIteration

Jeśli masz wystarczająco next() instrukcji, lub w pętli for, to powyższy przykład będzie trwał wiecznie.

Aby zapobiec wiecznej iteracji, możemy użyć StopIteration instrukcji.

w __next__() W metodzie, jeśli iteracja zostanie ukończona określoną liczbę razy, możemy dodać warunek końcowy, aby wywołać błąd:

Przykład

Zatrzymaj po 20 iteracjach:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    zwróć siebie
  def __next__(self):
    jeśli self.a <= 20:
      x = self.a
      self.a += 1
      zwróć x
    else:
      wywołaj StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
  print(x)

Uruchom przykład