Python3基础教程:return和yield的区别

一、说明

return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的)

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

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

二、return和yield的异同

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

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

三、实例说明

1 return版本

示例代码如下:

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,一次性返回给上层函数:
在这里插入图片描述
2 yield版本

示例代码如下:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''

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()

执行结果如下,可以看到上下层函数是交替进行的,即上层函数请求迭代一个值下层函数才生成一个值并立即返回这个值:
在这里插入图片描述
3 yield的意义

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

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

四、yield和return嵌套使用

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()

在这里插入图片描述

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3基础教程:return和yield的区别 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Python学习:import的正确用法

    import语句用来导入其他python文件(称为模块module),使用该模块里定义的类、方法或者变量,从而达到代码复用的目的。 将要建立文件的结构为: Tree |____ m1.py |____ m2.py |____ Branch |____m3.py |____m4.py 首先,先建立一个文件夹Tree作为工作目录,并在其内建立两个文件m1.py和…

    Python开发 2023年4月2日
    00
  • python返回多个值与赋值多个值

    一、总结 一句话总结: 返回多个值:def min_max(list1): return min(list1),max(list1) 赋值多个值:min1,max1=min_max([1,3,5]) 1、b,=tuple2 怎么理解? 当tuple2是元组或者列表,并且里面只有一个元素的时候,这样变量b可以取得这个tuple2里面的元素,而不是tuple2本…

    Python开发 2023年4月2日
    00
  • Http和Https的区别?

    1.HTTP是什么? http是超文本传输协议用来在web浏览器和网站服务器之间传递数据信息,http以明文的方式发送内容,不提供任何方式的数据加密,如果攻击者截获了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决http协议的这一缺陷,需要使用另一种协议:安…

    Python开发 2023年4月2日
    00
  • Python类和对象的绑定方法及非绑定方法

    类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。 一、绑定方法 1 对象的绑定方法 在类中没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制。 class Person: country = “China” def __init__(self, name, age): sel…

    Python开发 2023年3月31日
    00
  • python获取对象属性的几种方法

    当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢? 1.使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> type(123) <class ‘int’> >>> type(‘str’) <class ‘str’> &g…

    Python开发 2023年4月2日
    00
  • Python3教程:Pandas模块删除数据的几种情况

    开始之前,pandas中DataFrame删除对象可能存在几种情况1、删除具体列2、删除具体行3、删除包含某些数值的行或者列4、删除包含某些字符、文字的行或者列本文就针对这四种情况探讨一下如何操作。 数据准备 模拟了一份股票交割的记录。 In [1]: import pandas as pd In [2]: data = { …: ‘证券名称’ : [‘…

    Python开发 2023年4月2日
    00
  • Python中可以用三种方法判断文件是否存在

    通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错。所以最好在做任何操作之前,先判断文件是否存在。 这里将介绍三种判断文件或文件夹是否存在的方法,分别使用os模块、Try语句、pathlib模块。 1.使用os模块 os模块中的os.path.exists()方法用于检验文件是否存在。 判断文件是否存在 import os os…

    Python开发 2023年4月2日
    00
  • python3教程:默认参数为列表

    默认参数的坑 定义一个函数,传入一个list,添加一个end再返回 def add_end(L=[]): L.append(‘END’) return L 正常调用时,结果似乎不错 print (add_end([1,2,3])) #[1, 2, 3, ‘END’] 使用默认参数调用时,一开始结果也是对的,但是再次调用时,结果就不对了 ”’ 学习中遇到问题…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部