What happens when you invoke a function that contains yield?

狂风中的少年 提交于 2020-06-28 09:51:07

问题


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.

  1. Is that actually correct?
  2. 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?
  3. If the above are true, how would Python know when I invoke double_inputs() that it needs to wait until I call next(gen) before it even enters the loop while 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!