Doubt on generators behavior
Jussi Piitulainen
jpiitula at ling.helsinki.fi
Sun Oct 13 04:39:44 EDT 2013
Krishnan Shankar writes:
> Hi Friends,
>
> I am new to Generators and was learning the same by experimenting. I
> wrote a small code which is as below.
>
> >>> def test_gen(var):
> ... print "The number is", var
> ... if var % 2 == 0:
> ... yield var
> ... else:
> ... print "Number is odd"
> ...
> >>>
>
> But when i was executing i saw a behavior i could not
> understand. When i gave an even number,
> 1. The generator object was created
> 2. When i gave next the argument was yielded.
> 3. In the subsequent next the Stop Iteration was raised.
>
> >>> res = test_gen(78)
> >>> res.next()
> The number is 78
> 78
> >>> res.next()
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> StopIteration
Yes. The yield suspended the computation at a point where all that
remains is to fall through. That happens at next, and the exception is
raised then.
> But When i ran with an odd number the result of "Number is odd" is
> printed. But it seems the generator runs again by itself to Stop
> Iteration.
It doesn't run again. It just does what remains after the print
statement: it falls through, and the exception is raised.
> >>> res2 = test_gen(77)
> >>> res2.next()
> The number is 77
> Number is odd
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> StopIteration
> >>>
>
> How did this happen automatically? I am not able to get the
> execution of a generator. Can someone please help me in
> understanding?
I think you might benefit from the following experiments (untested):
def gen3(seed):
yield(seed)
yield(seed + 1)
yield(seed + 2)
def genby2(seed):
while True:
yield seed
seed += 2
def geneven(seed):
if seed % 2 == 1:
raise Exception('odd seed')
while True:
yield seed
seed += 2
def genrange(begin, end):
for k in range(begin, end):
yield k
...
Insert print statements at will, watch the behaviour, and I think
you'll get it quickly.
More information about the Python-list
mailing list