Robert Kern wrote: > vbgunz wrote: >> I believe I understand now. the yield keyword is sort of like a cousin >> to return. return will bring back an object I can work with and so does >> yield *but* yield's object will most likely support the .next() method. > > No, that's not really how it works. When a generator function is called, it > returns the generator object immediately. None of the code inside is executed. > Every time you call that generator function, you get a new generator object > with > the initial state. The objects that are yielded inside the code don't show up > yet. > > The code inside the generator gets executed only when the generator object is > iterated over (or its .next() method is called). The objects that are yielded > are the results of calling the .next() method. >
Maybe this will clarify it further. >>> def gen(n): ... while 1: ... print 'before yield' ... yield n ... print 'after yield' ... >>> g = gen('hello') >>> g.next() before yield 'hello' >>> g.next() after yield before yield 'hello' >>> g.next() after yield before yield 'hello' When the next() method is called the generator runs until it reaches a yield. At which point it's rests until the next() method is called again. Although there are times when I wish it could run (as a thread) until it reaches a yield and then continue after the next() method is called until it reaches the next yield. Cheers, Ron -- http://mail.python.org/mailman/listinfo/python-list