我无法理解该收益率表达式的输出

时间:2019-03-29 07:51:42

标签: python python-3.x

这是代码:

def counter(start=0):
    n = start
    while True:
        result = yield n
        print(type(result), result)
        if result == 'Q':
            break
        n += 1
c = counter()
print(next(c))
print(c.send('Wow!'))
print(next(c))
print(c.send('Q'))

这是输出:

0
<class 'str'> Wow!
1
<class 'NoneType'> None
2
<class 'str'> Q
Traceback (most recent call last):
File "gen.send.py", line 14, in <module>
print(c.send('Q')) # F
StopIteration

我可以理解为什么要打印类型行(<classs '.....' ......>),但是我不知道为什么要打印迭代次数(0、1和2),因为我不知道产量线是如何产生的应该打印出来,有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:0)

在生成器函数中,如果有这样的行:

result = yield n

有几件事要牢记:

  1. 与往常一样,当控件出现yield表达式时:
  2. 发电机将被挂起。
  3. 控件将返回到上一次在生成器上被调用的next()调用的“返回点”。
  4. 屈服表达式的值(在这种情况下为n)将作为该next()调用的返回值。
  5. send()的作用是在恢复生成器后立即影响整个产量表达式(不仅是产量表达式)的值。 (我们正在谈论的是send()触发生成器恢复之后的恢复后瞬间)。在这里, yield表达式yield n(不要与 yield表达式 n混淆)。通过发送'Wow',我们确保在恢复挂起的生成器后, yield表达式将立即具有字符串值'Wow',并且正是该字符串值将被分配给result

在您的程序中,产生的表达式始终为n,该表达式在循环的每次迭代中都递增。这个产生的表达式始终成为上一次被调用的next()的返回值,由于print (next(c))而被打印。

您发布的代码的输出为:

0
<class 'str'> Wow!
1
<class 'NoneType'> None
2
<class 'str'> Q
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)