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语句,就不再是一个函数了,而是变成了一个具有迭代功能的生成器。所以你无法用执行语句的方法调用他,必须用nextsend函数进行调用。然后涉及到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的下一跳语句开始执行。

 

posted @ 2019-11-08 22:39  PythonGirl  阅读(1015)  评论(0)    收藏  举报