Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Confused with python lists: are they or are they not iterators?

I am studying Alex Marteli's Python in a Nutshell and the book suggests that any object that has a next() method is (or at least can be used as) an iterator. It also suggests that most iterators are built by implicit or explicit calls to a method called iter.

After reading this in the book, I felt the urge to try it. I fired up a python 2.7.3 interpreter and did this:

>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> for number in range(0, 10): ...     print x.next() 

However the result was this:

Traceback (most recent call last):   File "<stdin>", line 2, in <module> AttributeError: 'list' object has no attribute 'next' 

In confusion, I tried to study the structure of the x object via dir(x) and I noticed that it had a __iter__ function object. So I figured out that it can be used as an iterator, so long as it supports that type of interface.

So when I tried again, this time slightly differently, attempting to do this:

>>> _temp_iter = next(x) 

I got this error:

Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: list object is not an iterator 

But how can a list NOT be an iterator, since it appears to support this interface, and can be certainly used as one in the following context:

>>> for number in x: ...     print x 

Could someone help me clarify this in my mind?

like image 751
NlightNFotis Avatar asked Oct 24 '12 17:10

NlightNFotis


People also ask

Are Python lists iterators?

A list is an iterable. But it is not an iterator. If we run the __iter__() method on our list, it will return an iterator.

What is the difference between iterator and list in Python?

A list is a data structure that holds a sequence of values. An iterator is an object that provides an interface to retrieve values one at a time, via the next function.

What are Python iterators example?

In Python, an iterator is an object which implements the iterator protocol, which means it consists of the methods such as __iter__() and __next__(). An iterator is an iterable object with a state so it remembers where it is during iteration. For Example, Generator.

Are iterators lazy in Python?

Iterators are lazy Iterators allow us to both work with and create lazy iterables that don't do any work until we ask them for their next item. Because of their laziness, the iterators can help us to deal with infinitely long iterables.


1 Answers

They are iterable, but they are not iterators. They can be passed to iter() to get an iterator for them either implicitly (e.g. via for) or explicitly, but they are not iterators in and of themselves.

like image 70
Ignacio Vazquez-Abrams Avatar answered Oct 11 '22 14:10

Ignacio Vazquez-Abrams