A bundle of questions from a Python newbie
Duncan Booth
duncan at NOSPAMrcp.co.uk
Thu Feb 21 04:33:00 EST 2002
Gonçalo Rodrigues <op73418 at mail.telepac.pt> wrote in
news:pk687ugc5s0uhs5h7v3bf3r2q8v4tl7bhi at 4ax.com:
> 12. This is not exactly about Python, but about programming in general.
> I keep reading about continuations and coroutines and I would like to
> know, in simple terms if possible, what the heck are they and in what
> ways they differ from generators as they exist in Python.
The main differences between a coroutine and a generator are:
1) Coroutines maintain their own stack. This allows a coroutine to yield
not just from the function you originally called, but also from any nested
function no matter how deep.
Python's generators can only yield directly from the generator as they do
not attempt to maintain any kind of stack.
BUT, this is misleading. If you want to split a generator function up into
smaller functions, say to make the code clearer, you can do this provided
all the smaller functions are also generators and the outer generator calls
them in a for loop and immediately yields out. So although a generator
doesn't have an explicit stack maintained by the Python runtime, you can
nest generators so that they behave in a very similar way to coroutines.
2) Coroutines allow you to pass arguments in each time they are activated
whereas generators only take arguments when they are created. There is a
conceptual difference here as coroutines are more peer to peer but
generators have more of a parent (the caller) and child (the generator)
relationship. Probably the best way to pass values in to a generator is to
pass it an iterator as an argument, but this may not be as convenient as
passing a value directly.
--
Duncan Booth duncan at rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?
More information about the Python-list
mailing list