Iterátory Pythonu
Iterátory Pythonu
Iterátor je objekt, který obsahuje spočítatelný počet hodnot.
Iterátor je objekt, který lze iterovat, což znamená, že můžete procházet všemi hodnotami.
Technicky v Pythonu je iterátor objekt, který implementuje protokol iterátoru, který se skládá z metod __iter__()
a __next__()
.
Iterátor vs Iterovatelný
Seznamy, n-tice, slovníky a množiny jsou všechny iterovatelné objekty. Jsou to iterovatelné kontejnery , ze kterých můžete získat iterátor.
Všechny tyto objekty mají iter()
metodu, která se používá k získání iterátoru:
Příklad
Vraťte iterátor z n-tice a vytiskněte každou hodnotu:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
I řetězce jsou iterovatelné objekty a mohou vrátit iterátor:
Příklad
Řetězce jsou také iterovatelné objekty, které obsahují sekvenci znaků:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
Procházení iterátorem
Můžeme také použít for
smyčku k iteraci přes iterovatelný objekt:
Příklad
Opakujte hodnoty n-tice:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
Příklad
Opakujte znaky řetězce:
mystr = "banana"
for x in mystr:
print(x)
Cyklus for
ve skutečnosti vytvoří objekt iterátoru a pro každý cyklus provede metodu next().
Vytvořte Iterátor
Chcete-li vytvořit objekt/třídu jako iterátor, musíte implementovat metody
__iter__()
a
__next__()
do svého objektu.
Jak jste se dozvěděli v kapitole Třídy/Objekty Pythonu , všechny třídy mají funkci nazvanou
__init__()
, která vám umožňuje provést určitou inicializaci při vytváření objektu.
Metoda __iter__()
se chová podobně, můžete provádět operace (inicializaci atd.), ale vždy musí vrátit samotný objekt iterátoru.
Metoda __next__()
také umožňuje provádět operace a musí vrátit další položku v pořadí.
Příklad
Vytvořte iterátor, který vrací čísla počínaje 1 a každá sekvence se zvýší o jednu (vrací 1,2,3,4,5 atd.):
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))
StopIteration
Výše uvedený příklad by pokračoval navždy, pokud byste měli dostatek příkazů next() nebo pokud by byl použit ve
for
smyčce.
Abychom předešli tomu, že iterace bude pokračovat navždy, můžeme použít
StopIteration
příkaz.
V __next__()
metodě můžeme přidat ukončovací podmínku pro vyvolání chyby, pokud je iterace provedena zadaným počtem opakování:
Příklad
Zastavit po 20 iteracích:
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)