理解步骤

  1. 把yield看成return,返回某个值,后面的程序就不再运行了
  2. 再把yield看成生成器(generator)的一部分,实际上,带yield的函数才是真正的迭代器

    简单示例

    简单的示例让你理解这两步,print的几行代码相当于单步调试: ```python def foo(): print(“starting…”) while True:
    1. res = yield 4
    2. print("res:",res)
    g = foo() print(next(g)) print(“20) print(next(g))

输出结果:

starting…

4

**

res: None

4

``` 上面代码运行结果解释:

  1. g=foo() foo函数不会真的执行,而是返回一个生成器g
  2. print(next(g))调用next方法,foo函数开始执行,先print,后进入while循环,遇到yield关键字,看成return,返回一个4,foo函数执行完毕,此时并没有赋值给res变量,所以此行代码输出starting…和4
  3. print("*"*20)打印20个“*”,此处用作分隔线
  4. print(next(g)) 再次调用next方法,foo函数再次被执行,此时不再从函数的开头开始执行,而是从上次next程序停止的位置开始执行,也就是res的赋值操作,但是右边的值在上次已经return出去了,所以把None赋给了res;接下来打印res的值,接着进入下一次循环,又遇到了yield,再次返回一个4,foo函数执行完毕。

    yield与return的区别

    接下来就要说下yield和return两者的区别了,看完上面,就会有一个疑问:我直接用return不行,为什么还要整个yield让人云里雾里?
    他两的区别整理如下:

  5. 带yield的函数是一个生成器,不再是一个函数

  6. 生成器有个方法next,相当于下次生成哪个数
  7. 第二次调用生成器next方法时,不再从函数开头执行,接上次程序停止的地方执行

    应用场景


参考自: python中yield的用法详解——最简单,最清晰的解释