Python的语法是简洁的,也是难理解的。
比如yield关键字:
def fun():
for i in range(5):
print('test')
x = yield i
print('good', x)
if __name__ == '__main__':
a = fun()
# print(a.__next__())
# print(a.__next__())
# print(a.__next__())
y = a.send(None)
y = a.send(-1)
y = a.send(-2)
#print(y)
凡是包含yield关键字的函数都不再是一个函数,而成为一个生成器(或迭代器,Generator)
Generator包含一个栈帧(Stack Frame),它维护Generator自身的执行状态,即便生成器的执行被暂停而返回到母程序中,下一次依然能恢复Generator的上一次的状态,从一个yield执行到下一个yield语句前。这就是生成器的执行方式。
迭代一个执行器可以使用send方法,也可以使用__next__方法,send方法能给Generator传递即时的数据,同时接收Generator内部执行状态,这个过程就是协程通信的基础。
而__next__方法只能从Generator接收内部执行状态,而无法向Generator中传入信息,所以__next__不能完成通信,因为通信不能是单向的。
__next__