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
In the list comprehension, it goes over all the items from the generator until the generator is done, and any item that is less than 15 becomes part of the list. The "if n < 15" does not control when the generator terminates, only which results from it are selected to be part of the list.

You can pass the maximum desired value to make it terminate:

def evens(max):
   i = 0
   while i <= max:
      yield i
      i += 2

L = list(evens(15))
L: [0, 2, 4, 6, 8, 10, 12, 14]

L = [n for n in evens(15)]
L: [0, 2, 4, 6, 8, 10, 12, 14]


Brian Vanderburg II
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to