On Sun, 13 Oct 2013 13:49:53 +0530, Krishnan Shankar wrote: > 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.
Correct. Follow the program logic. The first time you call next, execution of the generator begins: - the generator first prints "The number is 78"; - the "if" block is then checked, since 78 is an even number the line "yield var" is executed and 78 is yielded; - after "yield", execution halts until you call next again; - when you call next the second time, execution continues following the if...else block, which reaches the end of the function and StopIteration is raised. > 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. Again, follow the program logic. The first time you call next, execution of the generator begins: - the generator first prints "The number is 77"; - the "if" block is then checked, since 77 is an odd number the "else" clause is executed, and "The number is off" is printed; - execution continues following the if...else block, which reaches the end of the function and StopIteration is raised. Execution only halts at a yield statement. Try experimenting with this one: def example(): var = 3 print "Starting with", var yield var # pauses after this print "execution continues..." var -= 1 print "var now has result", var yield var # pauses after this var -= 1 print "var now has result", var yield 1000 + var # pauses after this yield "nearly done" # pauses after this print "Finished now." -- Steven -- https://mail.python.org/mailman/listinfo/python-list