yield keyword usage

Steve Holden steve at holdenweb.com
Mon Jul 30 20:47:57 EDT 2007


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.  Visit http://diveintopython.org/ for the
> latest version.
> """
> 
> __author__ = "Mark Pilgrim (mark 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,
> 
A function body with at least one yield expression (formerly a yield 
statement) in its body returns a generator when called:

 >>> def gen(i):
...   for k in range(i):
...     yield k*k
...
 >>> g = gen(3)
 >>> g
<generator object at 0x7ff2822c>
 >>>

The same function can be called multiple times to create independent 
generators - the particular example I have given created a generator for 
a given number of squares.

The generator can be used in an iterative context (such as a for loop), 
but in actual fact it observes the Python iterator protocol, so the 
generator has a .next() method, which can be used to extract the next 
value from it. Calling the .next() method runs the generator until a 
yield expression is encountered, and the value of the yield expression 
is the return value of the next method:

 >>> g.next()
0
 >>> g.next()
1
 >>> g.next()
4

When the generator function terminates (either with a return statement 
or by dropping off the end) it raises a StopIteration exception. This 
will terminate an iteration, but in other contexts it can be handled 
just like any other exception:

 >>> g.next()
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
StopIteration
 >>>

So the fibonacci example you quote is a generator function that will 
yield a sequence of Fibonacci numbers up to but not including the value 
of its argument.

regards
  Steve
-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC/Ltd           http://www.holdenweb.com
Skype: holdenweb      http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------




More information about the Python-list mailing list