Az iterátorok olyan objektumok, amelyekre iterálni lehet. Ebben az oktatóanyagban megtudhatja, hogyan működik az iterátor, és hogyan készítheti el saját iterátorát a __iter__ és __next__ módszerekkel.
Videó: Python Iterators
Iterátorok a Pythonban
Az iterátorok mindenhol megtalálhatók a Pythonban. Elegánsan valósulnak meg for
hurkok, megértések, generátorok stb. Keretein belül , de jól láthatók.
Az Iterator a Pythonban egyszerűen objektum, amelyre iterálni lehet. Olyan objektum, amely adatokat ad vissza, egy-egy elemet.
Technikailag elmondható, hogy a Python iterátor objektumnak két speciális módszert kell megvalósítania, __iter__()
és __next__()
együttesen iterátor protokollnak hívják .
Az objektumot iterálhatónak nevezzük, ha iterátort tudunk szerezni belőle. A Python legtöbb beépített tárolója, például: list, tuple, string stb. Iterable.
A iter()
függvény (amely viszont a __iter__()
metódust hívja meg ) iterátort ad vissza tőlük.
Iterálón keresztül iterálva
A next()
függvény segítségével kézzel iterálhatunk az iterátor összes elemén. Amikor a végére érünk, és nincs több adat, amit visszaküldhetnénk, ez felemeli a StopIteration
Kivételt. Következik egy példa.
# define a list my_list = (4, 7, 0, 3) # get an iterator using iter() my_iter = iter(my_list) # iterate through it using next() # Output: 4 print(next(my_iter)) # Output: 7 print(next(my_iter)) # next(obj) is same as obj.__next__() # Output: 0 print(my_iter.__next__()) # Output: 3 print(my_iter.__next__()) # This will raise error, no items left next(my_iter)
Kimenet
4 7 0 3 Traceback (a legutóbbi hívás utoljára): "" fájl, 24. sor, a következő (my_iter) StopIteration
Az automatikus iteráció elegánsabb módja a for ciklus használata. Ennek használatával iterálhatunk minden olyan objektumon, amely visszaadhat egy iterátort, például listát, karakterláncot, fájlt stb.
>>> for element in my_list:… print(element)… 4 7 0 3
A hurok kidolgozása az iterátorok számára
Amint a fenti példában láthatjuk, a for
hurok képes volt automatikusan ismétlődni a listán.
Valójában a for
hurok minden iterálható iterálhat. Vizsgáljuk meg közelebbről, hogyan for
valósul meg a hurok a Pythonban.
for element in iterable: # do something with element
Valójában végrehajtják.
# create an iterator object from that iterable iter_obj = iter(iterable) # infinite loop while True: try: # get the next item element = next(iter_obj) # do something with element except StopIteration: # if StopIteration is raised, break from loop break
Tehát belsőleg, a for
hurok létrehoz egy bejáró objektumot, iter_obj
hívja iter()
a iterable.
Ironikus módon ez a for
hurok valójában egy végtelen, míg a hurok.
A hurok belsejében felhívja next()
a következő elemet, és for
ezzel az értékkel hajtja végre a hurok törzsét . Miután az összes elem kipufog, StopIteration
felemelkedik, amely belül megfog és a hurok véget ér. Ne feledje, hogy bármilyen másfajta kivétel áthalad.
Egyedi iterátorok építése
Az iterátor nulláról való felépítése a Pythonban egyszerű. Csak végre kell hajtanunk a __iter__()
és a __next__()
módszereket.
A __iter__()
metódus maga az iterátor objektumot adja vissza. Szükség esetén néhány inicializálás elvégezhető.
A __next__()
metódusnak vissza kell adnia a sorozat következő elemét. A végére érve és a későbbi hívások során emelnie kell StopIteration
.
Itt bemutatunk egy példát, amely megadja a következő 2-es hatványt minden egyes iterációban. A hatvány kitevő nullától a felhasználó által beállított számig indul.
Ha fogalma sincs az objektum-orientált programozásról, keresse fel a Python objektum-orientált programozást.
class PowTwo: """Class to implement an iterator of powers of two""" def __init__(self, max=0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration # create an object numbers = PowTwo(3) # create an iterable from the object i = iter(numbers) # Using next to get to the next iterator element print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i))
Kimenet
1 2 4 8 Traceback (a legutóbbi hívás utoljára): "/home/bsoyuj/Desktop/Untitled-1.py" fájl, 32. sor nyomtatásban (következő (i) fájl "", 18. sor, __next__ __next__ fájlban emelje fel StopIteration StopIteration
Azt is használja a for
hurok végighaladni a bejáró osztályban.
>>> for i in PowTwo(5):… print(i)… 1 2 4 8 16 32
Python Végtelen Iterátorok
Nem szükséges, hogy az iterátor objektum elemét kimerítsék. Végtelen iterátorok lehetnek (amelyek soha nem érnek véget). Óvatosnak kell lennünk az ilyen iterátorok kezelésénél.
Itt van egy egyszerű példa a végtelen iterátorok bemutatására.
A beépített függvényfunkció iter()
két argumentummal hívható meg, ahol az első argumentumnak hívható objektumnak (függvénynek) kell lennie, a másodiknak pedig az őrszemnek. Az iterátor addig hívja ezt a függvényt, amíg a visszaadott érték meg nem egyezik az őrszem értékével.
>>> int() 0 >>> inf = iter(int,1) >>> next(inf) 0 >>> next(inf) 0
Láthatjuk, hogy a int()
függvény mindig 0-val tér vissza. Tehát annak átadásával iter(int,1)
egy iterátort kapunk, amely int()
addig hív, amíg a visszaadott érték meg nem egyezik. Ez soha nem történik meg, és végtelen iterátort kapunk.
Saját végtelen iterátorokat is létrehozhatunk. A következő iterátor elméletileg visszaadja az összes páratlan számot.
class InfIter: """Infinite iterator to return all odd numbers""" def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num
A mintafuttatás a következő lenne.
>>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7
Stb…
Az ilyen típusú végtelen iterátorok iterálásakor vigyázzon egy befejező feltételt.
Az iterátorok használatának előnye, hogy erőforrásokat takarítanak meg. A fentiekhez hasonlóan az összes páratlan számot megszerezhetnénk anélkül, hogy a teljes számrendszert tárolnánk a memóriában. Végtelen elemek lehetnek (elméletileg) a véges memóriában.
Van egy egyszerűbb módszer az iterátorok létrehozására a Pythonban. További információkért látogasson el a következő címre: Python generátorok a hozam használatával.