这是代码:
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)因为我无法理解屈服线应该如何打印它,可以有人请向我解释一下吗?
在生成器函数中,如果你有这样的行:
result = yield n
有一些简单的事情要记住:
yield
表达式时:next()
调用的“返回点”。n
)的值将作为该next()
调用的返回值返回。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)