On Mon, 16 Jan 2006, Christopher Spears wrote:
> I'm not sure if I understand __iter__. You use it to create an object > that iterates through itself using a next menthod ? Hi Chris, Yes, that's one application. But __iter__() doesn't necessarily have to return 'self'. For example, here's a useless toy class that might help explain what can happen if we do so without thinking: ################################ class MyListOfNumbers: def __init__(self, data): self.data = data def __iter__(self): return Pointer(self) class Pointer: def __init__(self, numbers): self.numbers = numbers self.offset = 0 def next(self): if self.offset == len(self.numbers.data): raise StopIteration element = self.numbers.data[self.offset] self.offset = self.offset + 1 return element ################################ Let's see how this might work: ####### >>> nums = MyListOfNumbers([0, 1]) >>> for x in nums: ... for y in nums: ... print x, y ... 0 0 0 1 1 0 1 1 ####### Now imagine what might happen if we didn't return a separate Pointer iterator: ################################################ class MyListOfNumbers2: def __init__(self, data): self.data = data self.offset = 0 def __iter__(self): return self def next(self): if self.offset == len(self.data): raise StopIteration element = self.data[self.offset] self.offset = self.offset + 1 return element #################################################### On a glance, this also looks reasonable: ###### >>> nums = MyListOfNumbers2([3, 1, 4, 1, 5]) >>> for n in nums: ... print n ... 3 1 4 1 5 ###### But, of course, you know that there has to be SOMETHING wrong here. *grin* And here's one example that shows a problem: ###### >>> nums = MyListOfNumbers2([0, 1]) >>> for x in nums: ... for y in nums: ... print x, y ... 0 1 >>> ###### We expected to see all pairs of 0-1 combinations, but came up way short. Do you know why? Best of wishes! _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor