gpt4 book ai didi

python 如何区分return和yield

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章python 如何区分return和yield由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、说明 。

return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的,感兴趣可参见“Linux Shell函数定义与调用”) 。

最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别.

python中最早看到yield应该是使用scrapy框架写爬虫的时候,之前也有去看yiled的用法,总记不太住。今天又去看了一下,基本上来就是讲些斐波那契数列的烦的要死,自己写段程序研究了一下,这里记一下.

2、return和yield的异同 。

共同点:return和yield都用来返回值;在一次性地返回所有值场景中return和yield的作用是一样的.

不同点:如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yeild则可以在循环内部逐个元素返回。下边我们举例说明这个不同点.

3、实例说明 。

3.1 return版本 。

示例代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class TestYield:
  def gen_iterator( self ):
   result_list = []
   for j in range ( 3 ):
    print (f "gen_iterator-{j}" )
    result_list.append(j)
   # return在循环的外部,待变量完全生成后一次性返回
   return result_list
 
  def call_gen_iterator( self ):
   # 执行下边这句后result_list直接是完成的结果[0,1,2]
   result_list = self .gen_iterator()
   for i in result_list:
    print (f "call_gen_iterator-{i}" )
 
if __name__ = = "__main__" :
  obj = TestYield()
  obj.call_gen_iterator()

执行结果如下,可以看到一次性执行完下层函数,生成完整的迭代器类型返回值result_list,一次性返回给上层函数:

python 如何区分return和yield

3.2 yield版本 。

示例代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TestYield:
  def gen_iterator( self ):
   for j in range ( 3 ):
    print (f "do_something-{j}" )
    # yield在for循环内部
    yield j
 
  def call_gen_iterator( self ):
   # yield并不是直接返回[0,1,2],执行下边这句后result_list什么值都没有
   result_list = self .gen_iterator()
   # i每请求一个数据,才会触发gen_iterator生成一个数据
   for i in result_list:
    print (f "call_gen_iterator-{i}" )
 
if __name__ = = "__main__" :
  obj = TestYield()
  obj.call_gen_iterator()

执行结果如下,可以看到上下层函数是交替进行的,即上层函数请求迭代一个值下层函数才生成一个值并立即返回这个值:

python 如何区分return和yield

3.3 yield的意义 。

从上边两个小节可以看到,虽然return和yield两者执行的顺序有区别,但整个要做的事情是一样的,所以使用yield并不会比return快,甚至我们可以猜测由于yield总发生上下文切换在速度上还会慢一些,所以速度不是yield的意义.

他们的主要区别是yiled要迭代到哪个元素那个元素才即时地生成,而return要用一个中间变量result_list保存返回值,当result_list的长度很长且每个组成元素内容很大时将会耗费比较大的内存,此时yield相对return才有优势.

4、yield和return嵌套使用 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class TestYield:
  def gen_iterator( self ):
   for j in range ( 3 ):
    print (f "do_something-{j}" )
    # yield在for循环内部
    yield j
 
  def gen_iterator_middle( self ):
   print (f "gen_iterator_middle" )
   # 返回的是迭代器的句柄,所以加一层return不影响是可以理解的
   return self .gen_iterator()
 
  def call_gen_iterator( self ):
   # yield并不是直接返回[0,1,2],执行下边这句后result_list什么值都没有
   result_list = self .gen_iterator_middle()
   # i每请求一个数据,才会触发gen_iterator生成一个数据
   for i in result_list:
    print (f "call_gen_iterator-{i}" )
 
if __name__ = = "__main__" :
  obj = TestYield()
  obj.call_gen_iterator()

python 如何区分return和yield

以上就是python 如何区分return和yield的详细内容,更多关于python return和yield的资料请关注我其它相关文章! 。

原文链接:https://www.cnblogs.com/lsdb/p/12534443.html 。

最后此篇关于python 如何区分return和yield的文章就讲到这里了,如果你想了解更多关于python 如何区分return和yield的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com