这是代码:
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),因为我不知道产量线是如何产生的应该打印出来,有人可以向我解释一下吗?
答案 0 :(得分:0)
在生成器函数中,如果有这样的行:
result = yield n
有几件事要牢记:
yield
表达式时:next()
调用的“返回点”。n
)将作为该next()
调用的返回值。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)