On Sat, Jan 18, 2014 at 6:24 PM, Keith Winston <keithw...@gmail.com> wrote: > > I guess it makes sense that iter() returns a type iterator.
`iter(obj)` returns `obj.__iter__()` if the method exists and the result is an iterator, i.e. has a `__next__` method. Otherwise if `obj.__getitem__` exists, it returns a generic sequence `iterator`. This steps through the sequence `obj[0]`, `obj[1]`, and so on, until it encounters either `IndexError` or `StopIteration`. `iter(callable, sentinel)` returns a `callable_iterator`. This returns `callable()` until either the result equals `sentinel` or it encounters `StopIteration`. For example: >>> sentinel = 2 >>> it = iter(iter(range(5)).__next__, sentinel) >>> type(it) <class 'callable_iterator'> >>> list(it) [0, 1] `reversed(obj)` returns `obj.__reversed__()`, if it exists. It doesn't check the type of the result: class C: __reversed__ = lambda s: 3.14 >>> reversed(C()) 3.14 Otherwise if `obj` is a sequence (`__getitem__`, `__len__`, and not a `dict`), it returns a `reversed` instance. This iterates from `obj[len(obj) - 1]` down to `obj[0]`. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor