当你调用一个包含yield的函数时会发生什么?

问题描述 投票:1回答:2

我读到 此处 下面的例子。

>>> 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

如果我对上面的理解是正确的,这似乎意味着Python实际上要等到 next(gen) 以 "奔向 "到 Line 2 在函数的主体中。换句话说,解释者将 开始执行函数的主体,直到我们调用了 next.

  1. 这其实是正确的吗?
  2. 据我所知,Python并不进行AOT编译,除了解析代码并确保它是有效的Python之外,它并不怎么 "瞻前顾后"。这种说法是否正确?
  3. 如果上述情况是真的,那么当我调用了 double_inputs() 它需要等待,直到我打电话 next(gen) 还没进入循环 while True?
python python-3.x generator abstract-syntax-tree yield
2个回答
3
投票

正确。调用 double_inputs 从来不执行任何代码;它只是返回一个 generator 对象。 的存在。yield 在体内的表现,发现当 def 声明是 经解析的语义,改变了 def 语句来创建一个 generator 对象而非 function 对象。


2
投票

该函数包含 yield 是一个发电机。

当你调用 gen = double_inputs()你会得到一个生成器实例。你需要通过调用 next.

所以对于你的第一个问题,是真的。当你第一次调用的时候,它的第1,2,3行是 next.

对于你的第二个问题,我不太明白你的意思。当你定义函数的时候,Python就知道你在定义什么,它在运行的时候不需要提前看。

对于你的第三个问题,关键是 yield 关键字。

© www.soinside.com 2019 - 2024. All rights reserved.