Питхон Итераторс (__итер__ и __нект__): Како их користити и зашто?

Итератори су објекти који се могу поновити. У овом упутству ћете научити како итератор ради и како можете да направите сопствени итератор помоћу метода __итер__ и __нект__.

Видео: Питхон Итераторс

Итератори у Питхону

Итератори су свуда у Питхону. Они се елегантно примењују у forпетљама, схватањима, генераторима итд., Али су скривени на видику.

Итератор у Питхону је једноставно објекат који се може поновити. Објекат који ће враћати податке, један по један елемент.

Технички гледано, Питхон објект итератора мора применити две посебне методе __iter__()и __next__(), заједнички назван итератор протокол .

Објект се назива итерабилним ако од њега можемо добити итератор. Већина уграђених контејнера у Питхон-у попут: лист, тупле, стринг итд. Су итерабилни.

iter()Функција (што заузврат позива __iter__()методу) враћа итератор од њих.

Итерирање кроз итератор

next()Функцију користимо за ручно итирирање кроз све ставке итератора. Када стигнемо до краја и не буде више података за враћање, покренуће се StopIterationизузетак. Следи пример.

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

Оутпут

 4 7 0 3 Трацебацк (последњи последњи позив): Датотека "", ред 24, у следећем (ми_итер) СтопИтератион

Елегантнији начин аутоматског понављања је коришћење фор петље. Користећи ово, можемо прелазити преко било ког објекта који може вратити итератор, на пример листа, низ, датотека итд.

 >>> for element in my_list:… print(element)… 4 7 0 3

Рад фор петље за итераторе

Као што видимо у горњем примеру, forпетља је могла аутоматски да се прелистава кроз листу.

У ствари, forпетља се може поновити преко било ког итерабилног елемента. Погледајмо ближе како се forпетља заправо имплементира у Питхон.

 for element in iterable: # do something with element

Заправо се спроводи као.

 # 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

Дакле, интерно, forпетља ствара објект итератора, iter_objпозивајући iter()итерабле.

Иронично, ова forпетља је заправо бесконачна вхиле петља.

Унутар петље позива next()да добије следећи елемент и извршава тело forпетље са овом вредношћу. Након што се сви предмети исцрпе, StopIterationподиже се који се изнутра хвата и петља се завршава. Имајте на уму да ће проћи било која друга врста изузетака.

Изградња прилагођених итератора

У Питхону је лако направити итератор од нуле. Само треба да спроведу __iter__()и на __next__()методе.

__iter__()Метод враћа итератора објекат саму. Ако је потребно, може се извршити нека иницијализација.

__next__()Метод мора вратити следећу ставку у низу. По завршетку и у наредним позивима, мора да порасте StopIteration.

Овде показујемо пример који ће нам дати следећи степен 2 у свакој итерацији. Експонент снаге започиње од нуле до броја корисника.

If you do not have any idea about object-oriented programming, visit Python Object-Oriented Programming.

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

Output

 1 2 4 8 Traceback (most recent call last): File "/home/bsoyuj/Desktop/Untitled-1.py", line 32, in print(next(i)) File "", line 18, in __next__ raise StopIteration StopIteration

We can also use a for loop to iterate over our iterator class.

 >>> for i in PowTwo(5):… print(i)… 1 2 4 8 16 32

Python Infinite Iterators

It is not necessary that the item in an iterator object has to be exhausted. There can be infinite iterators (which never ends). We must be careful when handling such iterators.

Here is a simple example to demonstrate infinite iterators.

The built-in function iter() function can be called with two arguments where the first argument must be a callable object (function) and second is the sentinel. The iterator calls this function until the returned value is equal to the sentinel.

 >>> int() 0 >>> inf = iter(int,1) >>> next(inf) 0 >>> next(inf) 0

We can see that the int() function always returns 0. So passing it as iter(int,1) will return an iterator that calls int() until the returned value equals 1. This never happens and we get an infinite iterator.

We can also build our own infinite iterators. The following iterator will, theoretically, return all the odd numbers.

 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 sample run would be as follows.

 >>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7

And so on…

Be careful to include a terminating condition, when iterating over these types of infinite iterators.

Предност употребе итератора је што штеде ресурсе. Као што је приказано горе, могли смо добити све непарне бројеве без чувања целог бројевног система у меморији. Можемо имати бесконачне предмете (теоретски) у ограниченом памћењу.

Постоји лакши начин за стварање итератора у Питхону. Да бисте сазнали више, посетите: Питхон генератори који користе ииелд.

Занимљиви Чланци...