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

Ethan Furman ethan at stoneleaf.us
Thu Aug 13 12:22:23 EDT 2009


Ethan Furman wrote:
> 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~
> 

Actually, I am mistaken (gasp! shock! ;).  A list comprehension will run 
until the iterator(s) it's based on end, and even() runs forever.

~Ethan~



More information about the Python-list mailing list