On Wed, Jan 22, 2014 at 8:57 PM, Keith Winston <keithw...@gmail.com> wrote: > I'm working my way through some of the examples in > > http://ivory.idyll.org/articles/advanced-swc/#list-comprehensions > > And tried this one: > >>>> class MyTrickyIter: > ... def __init__(self, thelist): > ... self.thelist = thelist > ... self.index = -1 > ... > ... def __iter__(self): > ... return self > ... > ... def next(self): > ... self.index += 1 > ... if self.index < len(self.thelist): > ... return self.thelist[self.index] > ... raise StopIteration > > FYI, this is supposed to be an example of how NOT to do an iterator, > because of the way it handles thelist (which is supposed to be an > iteratable construct, like a list, if I'm not confused).
thelist is more like a sequence, meaning you can use myseq[n] for every value of n between and including 0 and len(myseq) -1. (Although, sequences usually have other things, too.) An iterable is anything you can loop over with a for loop. This is a perfectly reasonable iterator, but iterators are always tricky when used as an iterable -- you can't do a nested loop over a single iterator, because the iterator used for both loops will be the same iterator, and keep the same state. > Anyway, my efforts to recreate the following example: > >>>> mi = MyTrickyIter(['a', 'b']) >>>> for i in mi: > ... for j in mi: > ... print i, j > > which should result in > > a b > > instead results in > > Traceback (most recent call last): > File "<pyshell#57>", line 1, in <module> > for i in mi: > TypeError: iter() returned non-iterator of type 'MyTrickyIter' > > I'm sort of wondering if there's a Py2 vs. Py3 issue here, but I don't see it. in Python 3, it should be __next__, not next. I'd suggest staying away from any old blog posts and articles, unless you'd care to learn Python 2.x instead of 3.x. ;) -- Devin _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor