More baby squeaking - iterators in a class

M.E.Farmer mefjr75 at hotmail.com
Sat Jan 1 02:47:55 EST 2005


py> from __future__ import generators
Hello again,
I was thinking about the __iter__ and what you were saying about
generators, so I opened up pyshell and started typing.
py> class R3:
...    def __init__(self, d):
...       self.d=d
...       self.i=len(d)
...    def __iter__(self):
...       d,i = self.d, self.i
...       while i>0:
...           i-=1
...           yield d[i]
...
py> r = R3('qwerty')
py> r.__class__
<class __main__.R3 at 0x01440A38>
py> r.__iter__
<bound method R3.__iter__ of <__main__.R3 instance at 0x0141BFB0>>
py> r.__iter__()
<stackless.generator object at 0x0143FE38>
py> a = r.__iter__()
py> a.next()
'y'

py> a.next()
't'
py> a.next()
'r'
py> a.next()
'e'
py> a.next()
'w'
py> a.next()
'q'
py> a.next()
Traceback (most recent call last):
File "<input>", line 1, in ?
StopIteration
>>>

Doh! ok now I get it __iter__ RETURNS a generator ;)
It seems so obvious now I look at it.
Sometimes I am a bit slow to catch on , but I never forget, much.

M.E.Farmer
Deeper down the rabbit hole.

M.E.Farmer wrote:
> Terry ,
> Thank you for the explanation . That is much clearer now, I have
played
> a bit with generators but have never tried to create a custom
iterator.
> I am just now getting into the internals part of python objects...
this
> langauage is still amazing to me!
> The reason I asked the question was because I tried that code I
posted
> and it worked fine in python2.2.3 ?
>
> >Ignoring the older iteration method based on __getitem__, which I
> recommend
> >you do ignore, yes, you cannot do that.
>
> py>class R3:
> ...    def __init__(self, d):
> ...       self.d=d
> ...       self.i=len(d)
> ...    def __iter__(self):
> ...       d,i = self.d, self.i
> ...       while i>0:
> ...           i-=1
> ...           yield d[i]
> ...
> py>a = R3('qwerty')
> py>dir(a)
> ['__doc__', '__init__', '__iter__', '__module__', 'd', 'i']
> py>for i in a:
> ...     print i
> ...
> y
> t
> r
> e
> w
> q
> Ok I don't see __getitem__  anywhere in this object.
> Still scratchin my head? Why does this work?
> M.E.Farmer




More information about the Python-list mailing list