Python Iterator

Python Iterator

En iterator är ett objekt som innehåller ett antal värden som kan räknas.

En iterator är ett iterablat objekt, vilket innebär att du kan traversera alla värden.

Tekniskt sett är en iterator ett objekt som implementerar iteratorprotokollet och innehåller metoder __iter__() och __next__().

Iterator VS Iterabla objekt (Iterable)

listor, tupler, ordningar och uppsättningar är iterabla objekt. De är iterabla behållare där du kan få tag på en iterator (Iterator).

Alla dessa objekt har en metod för att få tag på en iterator iter() Metod:

Exempel

Returnera en iterator från en tupel och skriv ut varje värde:

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))

Kör Exempel

Och till och med strängar är iterabla objekt och kan returnera en iterator:

Exempel

Strängar är också iterabla objekt som innehåller en serie tecken:

mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

Kör Exempel

Traversera iteratorn

Vi kan också använda en for-slinga för att traversera iterabla objekt:

Exempel

Iterera över värdena i en tupel:

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

Kör Exempel

Exempel

Iterera över tecknen i en sträng:

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

Kör Exempel

Tips:en for-slinga skapar faktiskt en iteratorobjekt och utför next() metod.

att skapa en iterator

För att skapa ett objekt/klass som en iterator måste objektet implementera __iter__() och __next__() metod.

Som du lärde dig i kapitlet om Python-klasser/objekt, har alla klasser en metod med namnet __init__() Funktionen, som tillåter dig att utföra några initialiseringar vid skapandet av objekt.

__iter__() Metoden fungerar på ett liknande sätt, du kan utföra operationer (initialisering osv) men måste alltid returnera iteratorobjektet själv.

__next__() Metoden tillåter också att du utför operationer och måste returnera nästa objekt i sekvensen.

Exempel

Skapa en iterator som returnerar tal, börjar från 1 och ökar varje sekvens med 1 (returnerar 1, 2, 3, 4, 5 osv):

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

Kör Exempel

StopIteration

Om du har tillräckligt med next() satser, eller använda dem i en for-sats, så kommer ovanstående exempel att fortsätta för evigt.

För att förhindra att iterationen fortsätter för evigt kan vi använda StopIteration satser.

i __next__() I en metod, om iterationen slutförs efter det specificerade antalet gånger, kan vi lägga till en avbrytelsevillkor för att utlösa ett fel:

Exempel

Stoppa efter 20 iterationer:

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)

Kör Exempel