472,955 Members | 2,334 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,955 software developers and data experts.

yield keyword usage

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 (ma**@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,

Jul 30 '07 #1
3 6810
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. Visit http://diveintopython.org/ for the
latest version.
"""

__author__ = "Mark Pilgrim (ma**@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.

Erik Jones

Software Developer | Emmaź
er**@myemma.com
800.595.4401 or 615.292.5888
615.292.0777 (fax)

Emma helps organizations everywhere communicate & market in style.
Visit us online at http://www.myemma.com
Jul 30 '07 #2
On Jul 30, 4:40 pm, Erik Jones <e...@myemma.comwrote:
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...@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...@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
Jul 30 '07 #3
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 (ma**@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 -------------

Jul 31 '07 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: Tobiah | last post by:
def maker(): for i in range(100): yield i foo:4: Warning: 'yield' will become a reserved keyword in the future File "foo", line 4 yield i ^ SyntaxError: invalid syntax
3
by: km | last post by:
Hi all, i didnt understand the purpose of 'yield' keyword and the concept of 'generators' in python. can someone explain me with a small example how generators differ from normal function...
12
by: Ioannis Vranos | last post by:
Just some thought on it, wanting to see any explanations. It was advised in this newsgroups that we should avoid the use of keyword register. However it is a language feature, and if it...
54
by: Sahil Malik [MVP] | last post by:
What the heck - I can't find it. A bit shocked to see it missing though. So "Does VB.NET have the yield keyword, or any equivalent of it" ? -- - Sahil Malik Upcoming ADO.NET 2.0 book -...
22
by: Mateuszk87 | last post by:
Hi. may someone explain "yield" function, please. how does it actually work and when do you use it? thanks in forward mateusz
2
by: cartoper | last post by:
I am coming to VB.Net from C#. One feature I really like about C# is the yield contextual keyword. Here is what MSDN says about it: -------------- Used in an iterator block to provide a value...
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
0
by: Aliciasmith | last post by:
In an age dominated by smartphones, having a mobile app for your business is no longer an option; it's a necessity. Whether you're a startup or an established enterprise, finding the right mobile app...
0
tracyyun
by: tracyyun | last post by:
Hello everyone, I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
2
by: giovanniandrean | last post by:
The energy model is structured as follows and uses excel sheets to give input data: 1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
3
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be using a very simple database which has Form (clsForm) & Report (clsReport) classes that simply handle making the calling Form invisible until the Form, or all...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 1 Nov 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM) Please note that the UK and Europe revert to winter time on...
0
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
0
isladogs
by: isladogs | last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, Mike...
1
by: GKJR | last post by:
Does anyone have a recommendation to build a standalone application to replace an Access database? I have my bookkeeping software I developed in Access that I would like to make available to other...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.