More baby squeaking - iterators in a class

M.E.Farmer mefjr75 at hotmail.com
Fri Dec 31 15:46:33 CET 2004


Reread Russel Blau post he is spot on with his comments:
Russel Blau wrote:
>I don't get that from the passage quoted, at all, although it is
somewhat
>opaque. It says that your __iter__() method must *return an object*
with a
>next() method; your __iter__() method below doesn't return such an
object,
>but instead returns a string. It then says that *if* your class
defines
>next(), which yours doesn't, __iter__() can return self.
>
>[spaces inserted; you should note that many newsreaders strip the TAB
>character...]
>
>> class R:
>>   def __init__(self, d):
>>     self.d=d
>>     self.i=len(d)
>>   def __iter__(self):
>>     if self.i == 0:
>>       raise StopIteration
>>     self.i -= 1
>>   return self.d[self.i]

>Solution: replace "__iter__" with "next" in the class definition
above,
>then add to the end:

>>  def __iter__(self):
>>    return self
That works exactly as advertised.

py> s = R('54645656')
... s.next()
'6'
... s.next()
'5'
... s.next()
'6'
... s.next()
'5'
... s.next()
'4'
.. s.next()
'6'
... s.next()
'4'
... s.next()
'5'
... s.next()
Traceback (most recent call last):
File "<input>", line 1, in ?
File "<input>", line 7, in next
StopIteration

And the other posters showed you how to create an iterator without a
next() .
Other than having no next() method they still work the same.




More information about the Python-list mailing list