【问题标题】:Python: two "yield"s in one functionPython:一个函数中有两个“yield”
【发布时间】:2015-06-19 09:49:05
【问题描述】:

我们在 Python 的 yield 上发现了一个有趣的问题。我们编写了一个简单的程序:

def F():
    for i in range(5, 9):
        for j in range(21, 29):
            x = yield i
            y = (yield j) * 100
            x += y
            print '>>>', x

gen = F()
next(gen)
a1 = gen.send(66)
a2 = gen.send(77)
print a1
print a2

结果是惊人的:

>>> 7766
21
5

i=5, j=21 => 产量 i => a1=21 => 发送(66) => x = 66

i=5, j=21 => 产量 j => a2=5 => 发送(77) => y = 7700

打印 7766

打印 21

打印 5

即在yield i之后,a1得到j的值;在yield j之后,a2得到i的值。

有人知道为什么yield 会这样吗?为什么不是 a1=5,a2=21?

【问题讨论】:

  • @AshwiniChaudhary 很抱歉错过了 next() 函数已执行。

标签: python yield coroutine


【解决方案1】:

next(gen) 从生成器中获取第一个元素 (i):

next(gen) # 5

那么gen.send(66) 等于j(即21)。由于您的第二个循环仍在工作,因此后续的 gen.send(77) 等于 i(仍然是 5)。

本质上,问题在于您使用 3 值,而不是 2

使用gen.send(None)next(gen) 启动生成器:

a1 = gen.send(None) # or a1 = next(gen)
a2 = gen.send(77)
print(a1, a2) # prints 5 21

【讨论】:

    【解决方案2】:

    next(gen) 调用从第一个yield i 返回的方法。您的a1 = gen.send(66) 然后在y = (yield j) * 100 处恢复该方法并从那里产生ja2 = gen.send(77) 行之后直接恢复该方法并从x = yield i 返回。

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2022-12-17
      • 2020-05-30
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多