概念

首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器)

实例

  1. def test():
  2. print("我只是个例子而已")
  3. while 1:
  4. res = yield 4
  5. print("res", res)
  6. if name == "__main__":
  7. t = test()
  8. print(t)
  9. # <generator object test at 0x10235bdd0>

此时可以看到, t是一个generator生成器, python中生成器最常用的两个方法
next 和 send, 其中 使用send时会默认帮你调用next

接着往下看

  1. def test():
  2. print("我只是个例子而已")
  3. while 1:
  4. res = yield 4
  5. print("res", res)
  6. if name == "__main__":
  7. t = test()
  8. res = next(t)
  9. print(res)
  10. # 我只是个例子而已
  11. # 4

可以看到, 此时res的值为 t这个生成器中yield返回的 4, 但是在yield处就卡住不继续往下运行了,原因是此时的yield的作用类似于return 后面的代码不会再执行,直到使用生成器send值
或者再次 next(x),这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None,

  1. def test():
  2. print("我只是个例子而已")
  3. while 1:
  4. res = yield 4
  5. print("res", res)
  6. if name == "__main__":
  7. t = test()
  8. res = next(t)
  9. print(res)
  10. next(t)
  11. # 我只是个例子而已
  12. # 4
  13. # res None
  1. def test():
  2. print("我只是个例子而已")
  3. while 1:
  4. res = yield 4
  5. print("res", res)
  6. if name == "__main__":
  7. t = test()
  8. res = next(t)
  9. print(res)
  10. t.sned(7)
  11. # 我只是个例子而已
  12. # 4
  13. # res 7