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