when an iterable object is exhausted or not

Steven D'Aprano steve+comp.lang.python at pearwood.info
Sun Aug 5 02:47:02 CEST 2012

On Sat, 04 Aug 2012 12:44:07 -0700, Tim Roberts wrote:

>>$$$ i = filter(lambda c : c.isdigit(), 'a1b2c3') 
>>$$$ for x in i : print(x,end=' ')
>>1 2 3
>>$$$ for x in i : print(x,end=' ')        # i is exhausted
>>IMHO, this should not happen in Py3k.
> It's interesting that it DOESN'T happen in Python 2.  The first "i" is
> of type list, the second "i" is of type string, and both are
> restartable.
> What's the type of "i" in the second case in Python 3?

In Python 3, filter returns a lazy iterator, a "filter object". It 
generates items on demand.

In Python 2, filter is eager, not lazy, and generates items all up-front. 
If the input is a string, it generates a string; if the input is a tuple, 
it generates a tuple; otherwise it generates a list.


More information about the Python-list mailing list