Marko Rauhamaa wrote: > Erik <pyt...@lucidity.plus.com>: > >> On 01/04/16 15:34, Marko Rauhamaa wrote: >>> Chris Angelico <ros...@gmail.com>: >>> >>>> *A range object is not an iterator.* >>> >>> We now have learned as much. >>> >>> However, doesn't that extra level of indirection seem like an odd >>> choice? >> >> [...] >> >> If you write your own class which has an __iter__ method, would you >> [...] expect both iterators to be independent and both return the >> 'foo', 'bar', 'baz' sequence (where that is the hypothetical result of >> iterating over your object)? >> >> If you now replace MyClass() with range(10), why would you expect the >> two iterators to be related? > > I simply had thought of range() returning an iterator. I would expect an > iterator to behave like one. > > There's a bit of a cognitive dissonance between iterables and iterators. > On the one hand, they behave identically in many contexts. On the other > hand, the distinction is crucial in some special cases.
You're missing a key point. All (well-behaved) iterators are iterables, with their __iter__ method returning themselves. for x in y: ... implies: try: _it = iter(y) while True: x = next(_it) ... except StopIteration: pass That's true for any iterable y, including a y which is itself an iterator. You still call iter() on it, and get _it, the iterator over y, which if y is an iterator is the same thing as y. -- Rob Gaddi, Highland Technology -- www.highlandtechnology.com Email address domain is currently out of order. See above to fix. -- https://mail.python.org/mailman/listinfo/python-list