Python Forum

Full Version: Generator function for even numbers
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I am trying to write a generator function to output even numbers

Here is my code:

def evenNumber(i):
    r = i * 2
    yield r


for i in range(1,21):
    print(evenNumber(i))
However, this is what I get which is not what I want.

<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
<generator object evenNumber at 0x00F7BDB0>
[Finished in 0.145s]
You need to iterate over the generator, r.g. in a for loop or list comprehension, so that the calculation is run.
The generator should written like this example:

def number_gen(start=0, step=1):
    while True:
        yield start
        start += step
It's an infinite generator, which means it has no exit condition.
Consuming this generator, requires for islice from itertools.

Consuming:
from itertools import islice


for number in islice(number_gen(start=0, step=2), 0, 10):
    print(number)
The number_gen code is not required, because it's in itertools.count.
Also the range object is very powerful and could solve your task if you need finite sequences.

even_numbers = list(range(0, 257, 2))
print(even_numbers)
ok thanks.
this is now working.

def evenNumber(s):
    b = 1
    while b <= s:
        yield b*2
        b += 1

for i in evenNumber(20):
    print(i)
it's better as
def even_numbers(end):
    for num in range(1, end + 1):
        yield numb * 2
you can pass optional argument for start too