yield keyword usage

mensanator at aol.com mensanator at aol.com
Tue Jul 31 00:38:39 CEST 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
> > """
>
> > __author__ = "Mark Pilgrim (m... at diveintopython.org)"
> > __version__ = "\$Revision: 1.2 \$"
> > __date__ = "\$Date: 2004/05/05 21:57:19 \$"
>
> > 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

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

```