Iterátor je objekt, který implementuje protokol iterátorů v Pythonu, což znamená, že má dunder metody __iter__() a __next__().
Iterátory umožňují iteraci přes kolekce prvků jedním směrem, aniž by bylo nutné načítat všechny prvky do paměti najednou.
Když jsou všechny prvky vyčerpány, vyvolá se výjimka StopIteration.
vytvoření iterátoru MyIterator
class MyIterator: def __init__(self, data): self.index = 0 self.data = data def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration value = self.data[self.index] self.index += 1 return valuemy_iter = MyIterator([1, 2, 3, 4, 5])for item in my_iter: print(item) # Vypíše 1, 2, 3, 4, 5
__iter__ vrací iterátor sám.
__next__ vrací další prvek v sekvenci nebo vyvolá StopIteration, pokud jsou všechny prvky vyčerpány.
Generátory
Generátory jsou speciální typy iterátorů, které jsou jednodušší na implementaci.
Jsou vytvářeny pomocí klíčového slova yield, které umožňuje funkcím vracet hodnoty postupně, místo aby vrátily vše najednou.
To umožňuje generovat hodnoty na požádání, což šetří paměť a umožňuje práci s velkými datovými soubory nebo nekonečnými sekvencemi.
vytvoření generátoru
def my_generator(data): for item in data: yield item * 2gen = my_generator([1, 2, 3, 4, 5])for item in gen: print(item) # Vypíše 2, 4, 6, 8, 10
automaticky implementují metody __iter__ a __next__ a spravují svůj interní stav.
Generátory jsou užitečné v situacích, kdy potřebujete efektivně generovat velké množství dat nebo pracovat s nekonečnými sekvencemi. Jsou také často používány ve spojení s funkcemi jako map(), filter() a reduce() pro elegantní manipulaci s daty.
generátor s nekonečnou řadou
def infinite_numbers(): num = 0 while True: yield num num += 1# Vytvoření instance generátorunumbers_gen = infinite_numbers()# Vypsání prvních deseti čísel z nekonečné řadyfor _ in range(10): print(next(numbers_gen)) # Vypíše 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Iterátory a generátory
Každý generátor je iterátor, ale ne každý iterátor je generátor.
Generátory poskytují jednodušší a kompaktnější způsob psaní iterátorů, protože automatizují vytváření metod __iter__() a __next__() a správu stavu.