On Jul 30, 4:40 pm, Erik Jones <[EMAIL PROTECTED]> wrote: > On Jul 30, 2007, at 4:13 PM, Ehsan wrote: > > > > > > > hi > > coulde any one show me the usage of "yield" keyword specially in this > > example: > > > """Fibonacci sequences using generators > > > This program is part of "Dive Into Python", a free Python book for > > experienced programmers. Visithttp://diveintopython.org/for the > > latest version. > > """ > > > __author__ = "Mark Pilgrim ([EMAIL PROTECTED])" > > __version__ = "$Revision: 1.2 $" > > __date__ = "$Date: 2004/05/05 21:57:19 $" > > __copyright__ = "Copyright (c) 2004 Mark Pilgrim" > > __license__ = "Python" > > > def fibonacci(max): > > a, b = 0, 1 > > while a < max: > > yield a > > a, b = b, a+b > > > for n in fibonacci(1000): > > print n, > > As in how it works? Sure, when you use the yield statement in a > function or method you turn it into a generator method that can then > be used for iteration. What happens is that when fibonacci(1000) is > called in the for loop statement it executes up to the yield > statement where it "yields" the then current value of a to the > calling context at which point n in the for loop is bound to that > value and the for loop executes one iteration. Upon the beginning of > the for loop's next iteration the fibonacci function continues > execution from the yield statment until it either reaches another > yield statement or ends. In this case, since the yield occured in a > loop, it will be the same yield statement at which point it will > "yield" the new value of a. It should be obvious now that this whole > process will repeat until the condition a < max is not longer true in > the fibonacci function at which point the function will return > without yielding a value and the main loop (for n in ...) will > terminate.
Also note that the function could terminate without ever executing a yield statement (if max<0). In which case nothing would get printed just like in for n in []: print n, You could also force the generator to abort rather than relying on the while loop not executing by using a return instead of a yield statement. This can be useful if the while executes even when given bad arguments. def fibonacci(max): if max < 0: # test for invalid argument print 'max must be >0' # diagnostic message return # kill generator a, b = 0, 1 while a < max: yield a a, b = b, a+b for n in fibonacci(1000): print n, print print for n in fibonacci(-1000): print n, ## 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 ## ## max must be >0 > > Erik Jones > > Software Developer | Emma® > [EMAIL PROTECTED] > 800.595.4401 or 615.292.5888 > 615.292.0777 (fax) > > Emma helps organizations everywhere communicate & market in style. > Visit us online athttp://www.myemma.com
-- http://mail.python.org/mailman/listinfo/python-list