what is it, that I don't understand about python and lazy evaluation?
ethan at stoneleaf.us
Thu Aug 13 16:47:56 CEST 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)
> >>> test(1, True) and test(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:
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.
More information about the Python-list