yield keyword usage
mensanator at aol.com
mensanator at aol.com
Mon Jul 30 18:38:39 EDT 2007
On Jul 30, 4:40 pm, Erik Jones <e... at myemma.com> 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 (m... at diveintopython.org)"
> > __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®
> e... at myemma.com
> 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
More information about the Python-list
mailing list