1、一句话快速理解
yield 等于 return 这么简单理解
2、详细说明:
yield和return的关系和区别了,带yield的函数是一个生成器,而不是一个函数了
这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。
3、从代码理解:
next()函数
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))
输出结果:
starting... 4 ******************** res: None
分析:直到调用next方法,foo函数正式开始执行,碰到yield 结束,再next 会续接到yield后,res没被执行(因为第一个next就直接return 掉了),
send()函数
def foo(): print("starting...") while True: res = yield 4 print("res:",res) g = foo() print(next(g)) print("*"*20) print(g.send(7))
输出结果
starting... 4 ******************** res: 7 4
分析:程序执行g.send(7),程序会从yield关键字那一行继续向下运行,send会把7这个值赋值给res变量,打印了 res:7 然后因为函数里面是while true循环,所以再次执行到 "res=yield 4" 返回4 打印4, 结束
4、优点
range pk yield
for n in range(1000): a=n range默认生成一个含有1000个数的list了,所以很占内存 def foo(num): print("starting...") while num<10: num=num+1 yield num for n in foo(0): print(n)