Tim Johnson wrote: > * Liam Clarke-Hutchinson <[EMAIL PROTECTED]> [051113 12:41]: > >>Someone correct me if I'm wrong, but I believe there is no specific iterator >>object, but rather objects that have a method for __iter___... > > > Some light is slowly dawning here (I think) .... from > http://docs.python.org/ref/yield.html > > It appears that a generator, is an object, but > not derived from a class, but from a generator function, > using yield.
I would say it is an object of a built-in class created by calling a generator function, which is a function that uses yield. You can create your own iterators by defining a class that defines the special methods __iter__() and next(). __iter__ just returs self, and next() returns the next item in the iteration or raises StopIteration. See http://docs.python.org/lib/typeiter.html Generators provide a convenient short-cut for creating many kinds of iterators because generator state is maintained implicitly. For example, a class for iterators that count from 1 to 10 might look like this: class counter: def __init__(self): self.count = 0 def __iter__(self): return self def next(self): if self.count < 10: self.count += 1 return self.count raise StopIteration The equivalent generator function could be def counter(): for count in range(1, 11): yield count or, maybe a fairer comparison would be def counter(): count = 0 if count < 10: count += 1 yield count which is still much shorter and easier to understand than the class version. Usage of all three is identical: for i in counter(): print i Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor