前面提到了协程,就会想起协程的基础-生成器,想起生成器就会想到yield。那就顺便记下这个yield的小测试题,每天看一眼,不然很容易遗忘。
这个yield小测试题主要的点有两个:
- next和send效果是一样的,区别就是next会送一个None给yield所在的函数,也就是例子中的fun_yield,而send会送后面括号里的值给fun_yield;
- 送进去的值谁来接收呢,那就是k来接收,你没看错:就是k = yield index的这个k拉接收。例如,运行一次next,k就被赋予None,然后调用一次send(2),k就被赋予了2。
记住这两点,下面的程序运行结果就不难理解了。然后从运行结果也看出为什么说生成器是协程的基础,例如index的值最终会被逐个输出,但是中间会插入send进去的值,这就像是一个程序被阻塞后加入了另一个程序到内存中执行,不就是协程的思想吗?
# -*- encoding=UTF-8 -*-
__author__ = 'wjj1982'
__date__ = '2019/8/23 11:21'
__product__ = 'PyCharm'
__filename__ = 'yield测试'
def fun_yield(N):
index = 0
for i in range(N):
k = yield index
print(k)
index += 1
def main():
"""1.先定义一个函数,里面带有yield
2. main函数引用,并send和next几个值"""
fun = fun_yield(15)
for i in range(4):
print(next(fun))
print(fun.send(2))
if __name__ == '__main__':
main()

网友评论