Why doesn't StopIteration get caught in the following code?

Terry Reedy tjreedy at udel.edu
Sat Apr 4 22:48:18 EDT 2009


grocery_stocker wrote:
...
>>>> while True:
> ...    i = gen.next()
> ...    print i
> ...
> 0
> 1
> 4
> Traceback (most recent call last):
>   File "<stdin>", line 2, in ?
> StopIteration

If you had written

for item in gen: print(i)

then StopIteration from gen would be caught.

One expansion of a for loop is (in the above case)

it = iter(gen) # not needed here, but is for general iterables
try:
   while True:
     i = it.next()
     print(i) # or whatever the loop body is
except StopIteration:
   pass

In other words, 'for i in iterable' expands to several lines of 
boilerplate code.  It is very useful syntactic sugar.

You left out the try..except part.




More information about the Python-list mailing list