Python函数中yield和return的区别_MGonster的博客-程序员ITS203_python return和yield

技术标签: python  Python  

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

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

下面通过实例对比return和yield

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




输出结果:

gen_iterator-0
gen_iterator-1
gen_iterator-2
call_gen_iterator-0
call_gen_iterator-1
call_gen_iterator-2

二、yield

直接把return改为yield

class TestYield:
    def gen_iterator(self):
        result_list = []
        for j in range(3):
            print(f"gen_iterator-{j}")
            result_list.append(j)
        yield 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()






输出结果:

gen_iterator-0
gen_iterator-1
gen_iterator-2
call_gen_iterator-[0, 1, 2]
在gen_iterator中yield和return的值是一样的,说明yield在一次性返回所有值时,他们的作用一样。

将result_list 改为 j

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




结果为:

do_something-0
call_gen_iterator-0
do_something-1
call_gen_iterator-1
do_something-2
call_gen_iterator-2

可以看到:上下函数是交替运行的,这说明上层函数请求迭代一个值,下层函数才生成一个值,并立即返回这个值。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huihiu8yuih/article/details/123716677

智能推荐

树形控件_qq_36417187的博客-程序员ITS203

这里写自定义目录标题树形控件原始功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入树形控件原始https://blog.csdn.net/qq_42402854/article/details/88789705我们对Markd

宝塔部署node项目_如何通过宝塔运维面板进行部署?_凯萨大地的博客-程序员ITS203

请配合视频观看~https://www.zhihu.com/video/1221565225276751872快速导航[宝塔简介](#btjj)[环境准备](#hjzb)[面板安装](#mbaz)[环境配置](#hjpz)[参数设置](#cssz)什么是宝塔面板?简介宝塔面板是一款服务器管理软件,支持windows和linux系统,可以通过Web端轻松管理服务器,提升运维效率。例如:创建管理网站、...

dnf登陆界面服务器显示数字,DNF让我成为了程序猿, 登录界面卡住了怎么办? 几个方法拯救你的卢克门票。..._独爱小珂yt的博客-程序员ITS203

原标题:DNF让我成为了程序猿, 登录界面卡住了怎么办? 几个方法拯救你的卢克门票。昨天游戏更新之后,有很多小伙伴跟小编反应DNF登录游戏的时候总是卡在登录界面怎么办? DNF哪次更新总要伴随点BUG,已经是司空见惯的事了。这个更新卡住看似小问题,要是在打卢克团时候掉线,重登卡住,那就是大问题了吧。 所以小编搜集了几个方法,各位不妨可以在登录游戏卡住的情况下尝试拯救一下自己的卢克门票先。进入C盘...

oracle view order by,关于ORACLE中CREATE VIEW 的时候用ORDER BY 和 WITH READ ONLY 的有关问题..._weixin_39684235的博客-程序员ITS203

关于ORACLE中CREATE VIEW 的时候用ORDER BY 和 WITH READ ONLY 的问题今天建立视图时遇到如下问题。按照如下方式建立报ora-00933错误:CREATE OR REPLACE VIEW AREA_TOWN ASSELECT a.area_name,a.cuidFROM AREA aORDER BY a.area_nameWITH READ ONLY;经过几次测...

qlv格式转换成mp4 视频格式转换_视觉68的博客-程序员ITS203

进入腾讯视频,将需要整理的视频下载                           在下载页面的右侧位置,如图“设置”位置,点击打开,将视频存储的位置 - 复制(后面有大用,切勿丢字母哦) 在“我的电脑”搜索栏部分,将刚复制的存储位置的连接,粘贴到搜索位置 - 如图所示。 粘贴 - 回车,出现如图所示文件 将目标文件“vodcache”,双击打开, (...

F - LJJ王国的数学家 递归_to_xf的博客-程序员ITS203

F - LJJ王国的数学家Description想要成为LJJ王国的数学家,你要秒切这样一个问题:给定n和k,输出k个非负整数加和等于n的所有方案。(按字典序)Input两个整数分别为n和k。(0<k<=n<=10)Output按字典序输出所有方案。SampleInput3 3Output3=0+0+33=0+1+23=0+2+13=0+3+03=1...

随便推点

nginx: [emerg] could not build the server_names_hash_奔狼的春晓的博客-程序员ITS203

手头有块板子,上面起了nginx配置了多个域名,启动的时候发现报错:nginx: [emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32大致意思说是域名build不了了,因为空间不够,需要increase域名的size。这里是官方的解释:htt...

不是公网ip怎么搭建服务器_快解析的博客-程序员ITS203_没公网ip怎么做服务器

服务器通常有两种搭建配置方式,一是在本地物理主机上搭建,一是在云服务器上配置实现。在没有公网IP的内网环境下,搭建服务器后,应该怎么提供互联网连接访问呢?这里提供一种内网穿透方案——快解析。只要有联网能上网,即可以通过快解析,将本地服务器内网IP端口映射到外网访问。以下是实现步骤:1.本地服务器搭建本地搭建服务器应用时,明确下自己应用场景,如IIS配置好web网站,或安装数据库服务,或办公OA/ERP等。2.内网访问明确内网应用场景,在局域网内电脑可以正常连接访问。并记录下所使用内网地.

第7课:郭盛华课程PHP超全局变量_郭盛华的博客-程序员ITS203

主讲老师:郭盛华超全局变量:PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。$GLOBALS — 引用全局作用域中可用的全部变量$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。PHP 在名为 $GLOB...

Mac 配置环境变量_weixin_33984032的博客-程序员ITS203

为什么80%的码农都做不了架构师?>>> ...

Redo log的六种状态(CURRENT、ACTIVE、INACTIVE、UNUSED、CLEARING、CLEARING_CURRENT)浅析_天上掉下个蓝妹妹的博客-程序员ITS203

Redo log的四种状态(CURRENT、ACTIVE、INACTIVE、UNUSED)浅析1. CURRENT指当前的日志文件,在进行实例恢复时是必须的;2. ACTIVE是指活动的非当前日志,在进行实例恢复时会被用到。Active状态意味着,Checkpoint尚未完成,因此该日志文件不能被覆盖。3. INACTIVE是非活动日志,在实例恢复时不再需要,但在介质恢复时

解决Element-UI加载列表时序号出现负数_一点点累积的博客-程序员ITS203

最近做的一个项目中左侧是树结构,右侧是列表,按照要求列表的第一行不显示序号所以写了个方法重新计算序号。点击左侧树结构在调用查询列表方法前将pageIndex设置为0,因为不设置为0的话如果之前查询的数据较多且做过翻页操作再点击左侧树,显示会有问题。在将pageIndex设置为0时会重新加载列表出现序号为负数的情况(会闪一下)影响用户体验,解决方法:在将pageIndex设置为0之前把右侧数据tab...