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