yield和return的区别
https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128
解释1
return是函数返回值,当执行到return,后续的逻辑代码不在执行yield是创建迭代器,可以用for来遍历,有点事件触发的意思
解释2
return是用来返回具体的某个值;yield一般与循环一起用,相当于生成了一个容器(常见的就是字典),然后在这个容器里面存放了每次循环以后的值,并且就在那放着,不输出,不返回,等你下次需要他的时候直接取出来用(调用)就行
解释3
换个角度来说,从控制权来说:
- 函数里遇到
return时,控制权交给主线程,然后没这个函数什么事了。 - 如果遇到
yield,控制权只是暂时交给主线程,函数继续在那等着。另外,函数里出现yield就自动变成生成器。
解释4
yield在写爬虫的时候用来循环获取数据挺好用的
- return:做一件事,做到A节点的时候,碰到"return 拿出成果", 那你就把成果拿出来,并且停止之后的事情。
- yield:做一件事,做到A节点的时候,碰到"yield 拿出成果" ,那你就把成果拿出来,拿出来之后,接着做后面的事情。
解释5
y和r所在的函数是两个性质不同的函数。你可以理解为只要一个函数包含yield语句,就不再是一个函数了,而是变成了一个具有迭代功能的生成器。所以你无法用执行语句的方法调用他,必须用next和send函数进行调用。然后涉及到send传递的参数值就是yield表达式的值。也就是比如你执行了send(5来调用yield函数,此时yield函数中有个表达式a=yield 3,如果你此时打印a的值,a的值为5。还有就是yield返回值就是send语句的值。比如上面那个例子,你打印send(5),那么它的值是3。
新手难以理解yield函数就是因为把生成器和普通的函数弄混了。可以说一个yeild函数除了长得像函数,其他的地方几乎没有函数的影子。他只是起了一个生成器的作用,多用于异步或者递归。
def yield_test(n): for i in range(n): yield call(i) # 它会立即把call(i)输出,成果拿出来后才会进行下一步,所以 i, ',' 会先执行 print("i=", i) # 后执行 def call(i): return i * 2 # 使用for循环 for i in yield_test(3): print(i, ",") # 这里的 i 是 call(i) ''' 0 , i= 0 2 , i= 1 4 , i= 2 '''
def odd(): print('step 1') yield 1 print('step 2') yield 2 print('step 3') yield 3 o = odd() print(next(o)) ''' step 1 1 ''' print(next(o)) ''' step 2 2 '''
理解的关键在于:下次迭代时,代码从yield的下一跳语句开始执行。

浙公网安备 33010602011771号