The Yield statement

Larry Bates larry.bates at websafe.com`
Tue Jul 1 01:21:10 CEST 2008


Alex Bryan wrote:
> Okay, so i don't really understand the Yield thing and i know it is 
> useful. I've read a few things about it but it is all programming jargon 
> and so basically it is hard for me to understand. So can anyone give me 
> a description or link me to a site that has a good definition and/or 
> examples of it? If you could I would really appreciate it.

Use yield when you want the function to act as a generator.  That is each time 
it is called it generates a response and returns it, but leaves its state intact 
so that the next time you call it, it can pick up where it left off and continue on.

Best example I ever saw is the code that implements os.walk() function:

def walk(top, topdown=True, onerror=None):
     """
     Example:

     from os.path import join, getsize
     for root, dirs, files in walk('python/Lib/email'):
         print root, "consumes",
         print sum([getsize(join(root, name)) for name in files]),
         print "bytes in", len(files), "non-directory files"
         if 'CVS' in dirs:
             dirs.remove('CVS')  # don't visit CVS directories
     """

     from os.path import join, isdir, islink

     try:
         names = listdir(top)
     except error, err:
         if onerror is not None:
             onerror(err)
         return

     dirs, nondirs = [], []
     for name in names:
         if isdir(join(top, name)):
             dirs.append(name)
         else:
             nondirs.append(name)

     if topdown:
         yield top, dirs, nondirs
     for name in dirs:
         path = join(top, name)
         if not islink(path):
             for x in walk(path, topdown, onerror):
                 yield x
     if not topdown:
         yield top, dirs, nondirs


Actually this code uses yield and is recursive.  Pretty neat.

-Larry



More information about the Python-list mailing list