Hello, (1) I do not understand an iterable type's __iter__() method to be compulsary. Actually, each time I have defined one, I had to write: def __iter__(self): return self So, I guess that if python does not find __iter__(), but the object defines next(), then by default the said object could be used as its own iterator. This is what I understand by "iterable" and next() is the required method for it. Or even better: only if the object does not define next(), then python falls back to looking for __iter__(). Is there any obstacle for this I cannot see? Side-question: In which cases is it necessary to define the iterator as a separate object? (2) But: for any reason next() is not spelled as a "magic" method. If this method becomes the distinctive method of iterables, then it should be called __next__() for consistency. Side-question: Why is it called next(), as it is a magic method for iterators already? (3) What I miss actually for iterables (which are their own iterator) is a kind of __reset__(). In some cases, it is only needed to allow a new iteration from start. But it may even be needed to set some startup data the first time. __reset__() would thus be called once before the first call to next(). (Sure, "reset" may not be the best term. Maybe "begin" or "startup"? The sense is: "Prepare to yield the first item!") In absence of such a startup mechanism, I end up using __call__ instead: Example: class Powers(object): def __init__(self, exponent): self.exponent = exponent def next(self): n = self.n + 1 if (self.max is not None) and (n > self.max): raise StopIteration self.n = n return n*n def __call__(self, min=1,max=None): self.n = min-1 self.max = max return self #.__iter__() def __iter__(self): return self tripleCubes = [] cubes = Powers(3) for sq in cubes(7,17): if sq%3 == 0: tripleCubes.append(sq) print tripleCubes # ==> [81, 144, 225] __iter__() could be used directly if it would allow "free" args in addition to self (in this case: def __iter__(self, min=0,max=None). This beeing impossible, an aditional method seems to be needed. To sum up, I would enjoy beeing able to write Powers using a scheme like: class Powers(object): def __init__(self, exponent): self.exponent = exponent def __reset__(self, min=1,max=None): self.n = min-1 self.max = max def __next__(self): n = self.n + 1 if (self.max is not None) and (n > self.max): raise StopIteration self.n = n return n*n This matches the overall idea of iterable for me. Denis -- ________________________________ la vita e estrany spir.wikidot.com