what is it, that I don't understand about python and lazy evaluation?

Ethan Furman ethan at stoneleaf.us
Thu Aug 13 10:47:56 EDT 2009


Erik Bernoth wrote:
> Hi List,
> 
> look at the following code:
> 
> def evens():
>     # iterator returning even numbers
>     i = 0
>     while True:
>         yield i
>         i += 2
> 
> # now get all the even numbers up to 15
> L = [n for n in evens() if n < 15]
> 
> Isn't it strange, that this code runs (in a lazy language) for eternity? 
> I would expect python to to spit out (in no time):
>  >> L
> [0, 2, 4, 6, 8, 10, 12, 14]
> 
> after 14 it is not nessesary to evaluate evens() any further.
> 
> I really started to ask myself if python really is lazy, but everything 
> else I wrote in lazy style still worked. Example:
>  >> def test(txt, retval):
> ..    print(txt)
> ..    return retval
> ..
>  >>> test(1, True) or test(2, True)
> 1
> True
>  >>> test(1, True) and test(2, True)
> 1
> 2
> True
> 
> 
> Can anybody explain what happens with evens()?
> 
> best regards
> Erik Bernoth
> 
> PS: The code comes from a list post from 2006. You find it here: 
> http://mail.python.org/pipermail/python-list/2006-November/585783.html
> 

As MRAB pointed out, the issue is not with evens, it's with the list 
comprehension.  The list comprehension doesn't know when to stop, only 
which numbers to include.

~Ethan~



More information about the Python-list mailing list