Let us create an iterator for a list and see how the next and iter function works:
>>> l1 = [2,25,33,12] >>> l1 [2, 25, 33, 12] >>> it1 = iter(l1) >>> it1 <list_iterator object at 0x7fc24f93aa58> >>> next(it1) 2 >>> next(it1) 25 >>> next(it1) 33 >>> next(it1) 12 >>> next(it1) Traceback (most recent call last): File "When we printed it1, it shows it as an list_iterator object. Everytime next is hit, it gave the next element and finally when there are no more elements, it gives StopIteration.", line 1, in StopIteration >>>
When we hit iter, it actually calls __iter__ method of the corresponding class. Meaning when we call iter on a list, it will call __iter__ of the list class. Similarly, when we hit next on an object, it calls the __next__ of the corresponding object.
Let us write a test class and have __iter__ and __next__ methods: This class takes a list as input and assigns it to data variable. The __iter__method simply returns the reference. The __next__ method returns the next available data element and increments the index by 1 after every iteration. And on finally reaching the maximum, the StopIteration exception is thrown.
Let us run and check:
>>> from iterator import TestIterator
>>> t1 = TestIterator([2, 25, 33])
>>> t1
<iterator.TestIterator object at 0x7f5782d4ea90>
>>> next(t1)
2
>>> next(t1)
25
>>> next(t1)
33
>>> next(t1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/guru/iterator.py", line 13, in __next__
raise StopIteration()
StopIteration
>>>
When the object t1 is created, it is showing as iterator.TestIterator object. On subsequent calls to next function, the __next__ method gets called and we get the subsequent values. Its this simple to have our own iterator.>>> t1 = TestIterator([2, 25, 33]) >>> t2 = iter(t1) Iter got called >>> t2 <iterator.TestIterator object at 0x7f5782d4ec88> >>>As seen here, on calling iter, the __iter__ method got called.
No comments:
Post a Comment