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