理解步骤
- 把yield看成return,返回某个值,后面的程序就不再运行了
- 再把yield看成生成器(generator)的一部分,实际上,带yield的函数才是真正的迭代器
简单示例
简单的示例让你理解这两步,print的几行代码相当于单步调试: ```python def foo(): print(“starting…”) while True:
g = foo() print(next(g)) print(““20) print(next(g))res = yield 4
print("res:",res)
输出结果:
starting…
4
**
res: None
4
``` 上面代码运行结果解释:
g=foo()
foo函数不会真的执行,而是返回一个生成器gprint(next(g))
调用next方法,foo函数开始执行,先print,后进入while循环,遇到yield关键字,看成return,返回一个4,foo函数执行完毕,此时并没有赋值给res变量,所以此行代码输出starting…和4print("*"*20)
打印20个“*”,此处用作分隔线print(next(g))
再次调用next方法,foo函数再次被执行,此时不再从函数的开头开始执行,而是从上次next程序停止的位置开始执行,也就是res的赋值操作,但是右边的值在上次已经return出去了,所以把None赋给了res;接下来打印res的值,接着进入下一次循环,又遇到了yield,再次返回一个4,foo函数执行完毕。yield与return的区别
接下来就要说下yield和return两者的区别了,看完上面,就会有一个疑问:我直接用return不行,为什么还要整个yield让人云里雾里?
他两的区别整理如下:带yield的函数是一个生成器,不再是一个函数
- 生成器有个方法next,相当于下次生成哪个数
- 第二次调用生成器next方法时,不再从函数开头执行,接上次程序停止的地方执行
应用场景