PEP 255: Simple Generators
uioziaremwpl at spammotel.com
Sat Jun 23 16:23:48 CEST 2001
On Sat, 23 Jun 2001, Andrew Dalke wrote:
> Me: Okay, the "def" statement is how you make a function.
> Chemist: Yeah, functions, I know those from FORTRAN.
> Me: And the "class" statement is how to make a new class.
> Chemist: Ohh! I finally get to learn about object-oriented programming!
> Me: And the "generator" statement is how to make a new generator.
> Chemist: A what? What's a generator?
> Me: It's a function that returns a special kind of object.
> Chemist: Then why isn't it called a function?
> Me: Well, you can think of a class as a function that returns
> a special kind of object.
> Chemist: Oooo..kaaay..
> Me: Okay, how about this. A generator turns a function into ...
> You know, I just don't know how to explain it well enough.
> But they are really easy to use - just pretend they are functions
> that return a list, except that you can only ask for the next
> item in the list.
> Chemist: But you said Python was also easy to understand.
Since we now have "def"/"yield" for generators, the discussion goes more
or less the same way. You just realizes that generators seem to be to
complicated for first time Python users. So you decide not to mention
them at the beginning, but later with the other advanced features.
So some days later, another friend comes to you. You explain him all the
basic programming features, but not generators. A week later, the friend
comes to you again.
Friend: Well, I programmed a little bit with Python. It really seems to
be very simple. I have just one problem: I've found a code
example somewhere on the web and there is a function in it, which
seems to behave a little bit strange. Perhaps you can help me.
Me: OK, let me see. Oh, right, this is a generator, not a function!
Friend: A what? It seems to be like a function but it has some yield
statements in it. What does yield do?
Me: Well, it returns an object and suspends the evaluation of the
block till the next iteration. Generators are special functions.
Friend: So yield does the same as return? Actually it has to be, because
there is no return in the, ehh, generator, but it returns some
object. So the returned value comes from the yield statement.
Me: No. I'll have to explain generators in more detail. When the
generator is called, it returns an iterator without evaluating
any of the code in the definition.
Friend: Returns an iterator? But when is the code executed then, if not
while calling it?
Me: It returns an iterator object. Then each time you call
iterator.next(), the code is executed until it reaches the next
yield, and the value after yield is return.
Friend: So it's not a function?!? Because you told me last time that
functions just execute the given statements in order.
Me: Yes, it's not a function, it's a generator. If you have a def
statement with a yield statement, it's a generator.
Friend: That's confusing. So def has two meanings depending on an
occurence of yield or not?
And so on....
More information about the Python-list