概念
首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器)
实例
def test():
print("我只是个例子而已")
while 1:
res = yield 4
print("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 4
print("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 4
print("res", res)
if name == "__main__":
t = test()
res = next(t)
print(res)
next(t)
# 我只是个例子而已
# 4
# res None
def test():
print("我只是个例子而已")
while 1:
res = yield 4
print("res", res)
if name == "__main__":
t = test()
res = next(t)
print(res)
t.sned(7)
# 我只是个例子而已
# 4
# res 7