Python下一步并发送相同的生成器

Gil*_*pie 2 python yield send next

根据我的理解,我写的这段python表现并不像我期望的那样yield.也许有人可以启发我.

def printvar():
    yield 3
    data = yield
    print(data)
    data = yield
    print(data)

x = printvar()
print(next(x))
x.send(4)
x.send(5)
Run Code Online (Sandbox Code Playgroud)

我期待的是:

3
4
5
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

3
5
Run Code Online (Sandbox Code Playgroud)

谁能解释这种行为?

Bre*_*arn 7

有两个问题.一个是通过将发生器推进三次,你只需将它提升到最后的产量,而不是之后的代码.另一个是send将其值作为yield语句的值,其中执行先前被暂停,而不是在下一个.以下是对所发生情况的逐步说明:

  1. 你第一次打电话来next执行第一次yield 3.
  2. 您下次调用send(4)导致yield 3评估为4的原因,但是您没有对此进行任何操作printvar,因此该值将被丢弃. .send(4)也将发电机推进到第一个data = yield,产生无.
  3. 您的下一次调用会.send(5)导致第一次 data = yield将数据设置为5,并将生成器推进到最后一次生成,再次产生None.
  4. 而已.您不再进一步推进发生器,因此执行在最后停止yield,从不执行最后一次print.

使用时需要记住的send是它将值发送到已经产生的位置,而不是发送到下一个产生的位置.有关更多说明,请参阅此类似问题.