【问题标题】:I can't understand the output of this Yield expression我无法理解这个 Yield 表达式的输出
【发布时间】:2019-03-29 07:51:41
【问题描述】:

这是代码:

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

我可以理解为什么要打印类型行 (&lt;classs '.....' ......&gt;),但我不明白为什么要打印迭代号(0、1 和 2),因为我不明白应该如何假设屈服线要打印它,有人可以向我解释一下吗?

【问题讨论】:

  • print(next(c)) 您是在此声明中打印它的人。由于yield n,当您在生成器上调用 next 时,n 的值会生成,然后打印它。

标签: python python-3.x


【解决方案1】:

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

result = yield n

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

  1. 与往常一样,当控件出现yield 表达式时:
  2. 生成器将暂停。
  3. 控件将返回到上次在生成器上调用的 next() 调用的“返回点”。
  4. yielded 表达式的值(在本例中为 n)将作为该 next() 调用的返回值返回。
  5. send() 的作用是在生成器恢复后立即影响整个 yield 表达式(不仅仅是 yield 表达式)的值。 (我们说的是恢复后的瞬间,在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)

【讨论】:

    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多