概念
首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器)
实例
def test():print("我只是个例子而已")while 1:res = yield 4print("res", res)if name == "__main__":t = test()print(t)# <generator object test at 0x10235bdd0>
此时可以看到, t是一个generator生成器, python中生成器最常用的两个方法
next 和 send, 其中 使用send时会默认帮你调用next
接着往下看
def test():print("我只是个例子而已")while 1:res = yield 4print("res", res)if name == "__main__":t = test()res = next(t)print(res)# 我只是个例子而已# 4
可以看到, 此时res的值为 t这个生成器中yield返回的 4, 但是在yield处就卡住不继续往下运行了,原因是此时的yield的作用类似于return 后面的代码不会再执行,直到使用生成器send值
或者再次 next(x),这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None,
def test():print("我只是个例子而已")while 1:res = yield 4print("res", res)if name == "__main__":t = test()res = next(t)print(res)next(t)# 我只是个例子而已# 4# res None
def test():print("我只是个例子而已")while 1:res = yield 4print("res", res)if name == "__main__":t = test()res = next(t)print(res)t.sned(7)# 我只是个例子而已# 4# res 7
