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. -- https://mail.python.org/mailman/listinfo/python-list