My Generator Paradox!

Ron Adam rrr at ronadam.com
Fri Mar 17 23:30:38 CET 2006


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














More information about the Python-list mailing list