我无法理解此Yield表达式的输出

问题描述 投票:-4回答:1

这是代码:

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)因为我无法理解屈服线应该如何打印它,可以有人请向我解释一下吗?

python python-3.x
1个回答
0
投票

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

result = yield n

有一些简单的事情要记住:

  1. 与往常一样,当控件来到yield表达式时:
  2. 发电机将被暂停。
  3. 控件将返回到最后在生成器上调用的next()调用的“返回点”。
  4. 所产生的表达式(在本例中为n)的值将作为该next()调用的返回值返回。
  5. send()的作用是在恢复发电机后立即影响整个产量表达式的值(不仅仅是产生的表达式)。 (我们正在谈论恢复后的瞬间,在send()触发恢复发电机之后立即)。这里,产量表达式是yield n(并且不要与产生的表达式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)
© www.soinside.com 2019 - 2024. All rights reserved.