when an iterable object is exhausted or not

Tim Chase python.list at tim.thechases.com
Sat Aug 4 22:24:02 CEST 2012


On 08/04/12 14:20, Franck Ditter wrote:
> Two similar iterable objects but with a different behavior :
> 
> $$$ i = range(2,5)
> $$$ for x in i : print(x,end=' ')
> 
> 2 3 4 
> $$$ for x in i : print(x,end=' ')        # i is not exhausted   
> 
> 2 3 4 
> 
> --------- Compare with :
> 
> $$$ 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.
> What is the rationale of this (bad ?) design, which forces the programmer
> to memorize which one is exhaustable and which one is not ?...

I can't speak to the rationale, but it seems that a range() object
has some extra features that a normal iter doesn't:

  >>> i = iter(range(2,5))
  >>> for x in i: print (x, end=' ')
  ...
  2 3 4 >>> for x in i: print (x, end=' ')
  ...

(your 2nd behavior, and what I'd expect).

So my guess would be that the "for {var} in {thing}" triggers a
re-calling of range.__iter__ since it's not an iterator to begin with.

-tkc





More information about the Python-list mailing list