Python Iterators (__iter__ és __next__): Hogyan kell használni és miért?

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 forhurkok, 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 StopIterationKivé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 forhurok képes volt automatikusan ismétlődni a listán.

Valójában a forhurok minden iterálható iterálhat. Vizsgáljuk meg közelebbről, hogyan forvaló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 forhurok létrehoz egy bejáró objektumot, iter_objhívja iter()a iterable.

Ironikus módon ez a forhurok valójában egy végtelen, míg a hurok.

A hurok belsejében felhívja next()a következő elemet, és forezzel az értékkel hajtja végre a hurok törzsét . Miután az összes elem kipufog, StopIterationfelemelkedik, 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 forhurok 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.

érdekes cikkek...