Home » Odeon Blogs » Calvin, Weaver »

Python Yield versus Return

Python Yield versus Return

As coders, we are familiar with how function calls work in Python or C.  Whenever we call a function, the function gets a private namespace where its local variables are created.

Return

The return statement is where all the local variables are destroyed and the resulting value is given back (returned) to the caller.  Should the same function be called some time later, the function will get a fresh new set of variables.

Yield

But what if the local variables aren't thrown away when we exit a function?  This implies that we can resume the function where we left off.  This is where the concept of generators are introduced and the yield statement resumes where the function left off.

Here's a simple example:

  1. def generate_integers(N):
  2. for i in range(N):
  3. yield i

So here's what actually happens and we can observe this in our python (or ipython) shell:

  1. In [1]: gen = generate_integers(3)
  2. In [2]: gen
  3. <generator object at 0x8117f90>
  4. In [3]: gen.next()
  5. 0
  6. In [4]: gen.next()
  7. 1
  8. In [5]: gen.next()
  9. 2

So that's the difference between return and yield statements in Python.  yield statement is what makes a function a generator function.


Category: Python

Discussion

  1. Actually just the ability to call the .next() method might not sound that helpful at first read. A good example is something like: http://users.softlab.ntua.gr/~ttsiod/yield.html
    Where it iterates over the Permutation class in a lazy manner. Here's an example of Fibonacci numbers:

    # the generator
    def fib():
    a = b = 1
    while True:
    yield a
    a,b = b,a+b

    # usage
    for i in fib():
    if i > 100:
    break
    else:
    print i




Leave a Comment :

(required)


(required)




(required)




(required)






Leave a Comment


Page generated in: 0.21s