Generators versus Coroutines

Bernhard Mulder bwm at acm.org
Mon Aug 16 12:08:10 EDT 2004


If you want, you can yield across multiple levels by converting 
functions into generators and calls into for loops.

The following function illustrates this approach:

    def ack(m, n):
        if m == 0:
          yield n + 1
          return
       if m > 0 and n == 0:
          for i in ack(m-1, 1):
             yield None
          yield i
          return
       if m > 0 and n > 0:
          for i in ack(m, n-1):
             yield None
          t = i
          for i in ack(m-1, t):
             yield None
          yield i
          return

You call this function this way:

for i in ack(2, 2):
     pass
# now i contains the function value.


Paul Rubin wrote:
> Michael Sparks <zathras at thwackety.com> writes:
> 
>>>It seems to me that in python, generators are not truly coroutines.
>>
>>Assuming you mean there isn't available a default scheduler for them, or
>>there isn't pre-emption built-in I agree. If you mean something else, I'm
>>curious as to what you think is missing. (I've also been using generators
>>as co-routines for sometime for various reasons)
> 
> 
> You can't yield across multiple levels of function calls.  That's why
> they're called "simple generators" instead of just "generators".




More information about the Python-list mailing list