问题
I read here the following example:
>>> def double_inputs():
... while True: # Line 1
... x = yield # Line 2
... yield x * 2 # Line 3
...
>>> gen = double_inputs()
>>> next(gen) # Run up to the first yield
>>> gen.send(10) # goes into 'x' variable
If I understand the above correctly, it seems to imply that Python actually waits until next(gen)
to "run up to" to Line 2
in the body of the function. Put another way, the interpreter would not start executing the body of the function until we call next
.
- Is that actually correct?
- To my knowledge, Python does not do AOT compilation, and it doesn't "look ahead" much except for parsing the code and making sure it's valid Python. Is this correct?
- If the above are true, how would Python know when I invoke
double_inputs()
that it needs to wait until I callnext(gen)
before it even enters the loopwhile True
?
回答1:
Correct. Calling double_inputs
never executes any of the code; it simply returns a generator
object. The presence of the yield
expression in the body, discovered when the def
statement is parsed, changes the semantics of the def
statement to create a generator
object rather than a function
object.
回答2:
The function contains yield
is a generator.
When you call gen = double_inputs()
, you get a generator instance as the result. You need to consume this generator by calling next
.
So for your first question, it is true. It runs lines 1, 2, 3 when you first call next
.
For your second question, I don't exactly get your point. When you define the function, Python knows what you are defining, it doesn't need to look ahead when running it.
For your third question, the key is yield
key word.
来源:https://stackoverflow.com/questions/61646335/what-happens-when-you-invoke-a-function-that-contains-yield