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)