Writing generators

#!/usr/bin/env python

# [SNIPPET_NAME: Writing generators]
# [SNIPPET_CATEGORIES: Python Core]
# [SNIPPET_DESCRIPTION: How to write a function you can iterate on]
# [SNIPPET_AUTHOR: Josh Holland <[email protected]>
# [SNIPPET_LICENSE: GPL]
# [SNIPPET_DOCS: http://docs.python.org/reference/simple_stmts.html#the-yield-statement, http://www.python.org/dev/peps/pep-0255/]

def fibonacci(start=(0, 1), stop=10):
    """Generate an iterator on the first 'stop' Fibonacci numbers, starting with
    the optional pair of numbers given as an argument.

    """
    a, b = start
    while stop:
        yield a         # the magic happens here.
                        # yield acts like return, but control resumes there
                        # on the next iteration
        a, b = b, a + b
        stop -= 1

for num in fibonacci():
    print num