初学python生成器时,对其大概的了解是:包含yield的函数是一个生成器,即便其中还包含return语句,依然是一个生成器。函数调用时并不运行函数体,而是返回一个迭代器。与迭代器一样使用。
但依然有疑问,生成器的 send方法是如何运作的?为什么当生成器被挂起时用它才有意义?
第一个疑问
看一段代码:
>>> def test(val=0):
while True:
y = yield val
print(y)
>>> t = test() # 启用生成器
>>> next(t)
0
>>> next(t)
None
0
这段代码是Next的使用,但唯独有一个疑问:
为什么第二次Next调用后,print(y)输出了None,而不是 0 ?
因为赋值语句从等号右边开始
第一次Next调用后,执行等号右边的表达式 yield val,执行完后函数暂停运行,赋值操作根本没有被执行。
当第二次再运行时才执行赋值(等号左半部分),而生成器恢复运行时,yield初始值为None,所以 y = None