Python 生成器里面的 return 有什么用?

Python----‘return’ 结束函数调用 assert_equal 函数功能是测试double_numbers函数功能,相当于一个单元测试接口,原理是多重函数调用,在assert_equal函数中调用double_numbers函数进行计算,返回实际结果与预期结果做比较,相等则返回ok,不等则返回错误信息。double_numbers函数在完成乘法运算 1 x 2 = 2,之后就把 2 返回到了调用它的assert_equal函数进行测试,测试结果肯定是错误的,这告诉我们当遇到return时候,循环结束了函数不执行了,直接返回结果。 阅读详情

大家好,我是菜鸟哥!

最近,在交流群里,有一位小伙伴问了这样一个问题:

def gen_data(num):
    if num > 10:
        for i in range(num):
            yield i
    else:
        return num

generator = gen_data(5)
for num in generator:
    print(num)

当传入的的参数小于等于 10  的时候,为什么没有返回这个参数本身?

这道题,当我们传入的参数大于 10 的时候,能得到符合预期的结果

如下图所示:

但是,当我们传入数据 5 的时候,我们来看看运行效果:

可以看到,数字 5 并没有被打印出来,程序直接运行到了最后

之所以会出现这种情况,是因为这个同学以为,当参数大于 10 的时候,gen_data(12)返回的是生成器,而当参数不大于 10 的时候,返回的是一个数字

显然这样的想法是不对的,否则,for num in 10这种语法早就报错了,数字是不能被迭代的

正确的说法应该是,因为gen_data里面有yield,所以gen_data(参数)返回一个生成器。无论参数传入的是什么,返回的都是生成器

如下图所示:

为了说明为什么传入参数为 5 的时候,for 循环不执行,我们简化一下代码:

def gen_data():
    yield 1
    yield 2
    yield 3
    return 4

generator = gen_data()
for num in generator:
    print(num)

运行效果如下图所示:

可以看到,对于这样一个非常简单的生成器,在 for 循环里面也只是打印了数字123,并没有打印数字 4

关于生成器中的return,我们可以从 Python 官方文档PEP 255 — Simple Generators[1]中找到说明:

return 在生成器中,表示生成器运行完成了,可以结束了。然后生成器会抛出一个StopIteration的异常。而for循环能够检测到这个异常,于是结束循环

所以当我们传入的参数为 5 的时候,生成器直接运行到了 return,于是它直接就抛出StopIteration,于是 for 循环检测到这个异常就结束了

在生成器里面的return只是一个结束标志,它不会把后面写的值返回给调用者,这跟函数里面的return语句是不一样的

推荐阅读:知识星球: 菜鸟学投资,星球来了!入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|年度爆款文案1).卧槽!Pdf转Word用Python轻松搞定!2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密 4).80行代码!用Python做一个哆来A梦分身 5).你必须掌握的20个python代码,短小精悍,用处无穷 6).30个Python奇淫技巧集 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货 8).再见Python!我要学Go了!2500字深度分析!9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片点阅读原文,领AI全套资料!
python之生成器 生成器 1.生成器 生成器(generator)也是一种迭代器,在每次迭代时返回一个值,直到抛出 StopIteration 异常。它有两种构造方式: (1).生成器表达式 和列表推导式的定义类似,生成器表达式使用 () 而不是 [] ,比如: 可以看出生成器表达式无法像列表推导式那样直接输出,它和可迭代对象一样只能采用for循环调用next()函数 (2).生成器函数 含有 yield 关键字的函数,调用该函数时会返回一个生成器。 可以看到,上面的函数没有使用 return 语句返 阅读详情

相关推荐

【Python】一直没搞懂生成器是什么。。

上期我们讲解了迭代器 这期我们来讲讲它的好兄弟——生成器 ### 生成器 (Generator)? 生成器是一种特殊的 **`迭代器`** (`Iterator`)。 **迭代器** 是你可以逐个访问其元素的对象(比如在 `for` 循环中使用)。列表、元组、字典、字符串等都是可

https://github.com/ianchen-dev 1074

Python的return和yield,哪个是你的菜?

在Python中,return语句用于从函数中输出数据到调用者。当函数执行到return时,它会立即停止执行当前函数并返回指定的值

xyh2004的博客 1930

FPGA AXI DDR3读写时序调试与FIFO缓存实战解析

本文深入解析FPGA中AXI协议与DDR3的读写时序调试,重点探讨FIFO缓存在数据流控制中的关键作用。通过实战案例详细讲解突发传输中的地址对齐、数据分片等常见问题,并提供状态机设计、仿真波形分析和性能优化技巧,帮助开发者高效解决高速数据存储场景下的时序同步与数据一致性问题。

blockchain9miner的博客 1117

python yield generator 详解

  本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,generator使用中的注意事项。本文不包括enhanced generator即pep342相关内容,这部分内容在之后的博文介绍。 generator基础   在python的函数(function)...

weixin_34239592的博客 1413

2025最新正版Autodesk 3ds Max 2022安装教程:从下载到中文环境配置全流程解析

Autodesk 3ds Max 2022是一款专业的三维建模、动画和渲染软件,广泛应用于影视制作、游戏开发、建筑可视化等领域。

waicsdn_haha的博客 1万+

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下...

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下 CT Image with Window presets This is an example of displaying a ct image along with buttons to set ww/wc pres...

浩秦的博客 1841

python终止代码_在Python中从块内停止生成器

class Node(object):def __init__(self, val, left=None, right=None):self.val = valself.left = leftself.right = right# the producing coroutine, it sends data to the consumerdef depth_first_search(self, c...

weixin_39552204的博客 317

【C++PTA】6-1 Point类的运算 (10 分)

定义Point类,有坐标x,y两个私有成员变量;对Point类重载“+”(相加)、“-”(相减)和“==”(相等)运算符,实现对坐标的改变,要求用友元函数和成员函数两种方法实现。对Point类重载<<运算符,以使得代码 Point p; cout<<p<<endl;可以输出该点对象的坐标。 函数接口定义: 实现Point类。 裁判测试程序样例: /* 请在这里填写答案 */ int main(int argc, char const *argv[]) { P

libertye的博客 2367

生成器return值你真的会用吗?5个必须掌握的应用场景

掌握PHP 5.5 生成器 return 值的正确用法,解决内存占用高、数据流处理低效问题。涵盖迭代大数据、协程通信、中断执行等5个典型场景,提升代码性能与可读性,值得收藏

CompiTide的博客 481

光电容积脉搏波PPG信号分析笔记

脉搏波信号PPG分析笔记

teresa_zp的专栏 6477

麒麟系统无法进入单用户模式该怎么办?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1820

python中的yield和return—迭代器和生成器

yield和return有什么区别?什么事生成器?什么又是迭代器?他们都有什么作用?简单理解的话yield=return,返回函数体处理结果的!yield本身是一个生成器,所以使用return返回的是我们常见的一些object(eg:list、dict、等),使用yield返回的是一个迭代器对象!

诡途的博客 1万+

【AI智能体】Codex + Seedance2.5 制作AI视频实战操作详解

【AI智能体】Codex + Seedance2.5 制作AI视频实战操作详解

congge_study的博客 3777

生成器里面的 return 有什么用?

↑↑↑关注后"星标"简说Python人人都可以简单入门Python、爬虫、数据分析简说Python推荐 来源:未闻Code作者:kingname 在粉丝群里,有一位同学...

简说Python的博客 617

脑机接口中的视觉信号解码:原理、技术与应用

脑机接口中的视觉信号解码:原理、技术与应用​ ,人工智能,计算机视觉,大模型,AI,脑机接口(Brain - Computer Interface,BCI)作为一种革命性的技术,致力于搭建人脑与外部设备之间的直接通信桥梁,绕开传统的神经肌肉输出通路。其核心目标是解读大脑活动产生的信号,从而实现对外部设备的精准控制或信息交互。在众多脑机接口研究方向中,视觉信号解码因其独特的优势和广泛的应用前景,吸引了大量科研人员的关注。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 20万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

python里的return用在循环里_python中生成器对象和return 还有循环的区别

python中生成器对象和return 还有循环的区别在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因为return后面就不能跟任何东西,意味着函数的结束。那么我们完全可以这么做:def main():for i in range(1,100):yield i这样就等于生成了一个循环返回对象,特别在爬虫...

weixin_39612653的博客 117

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python中的yield和return的区别

python中的yield和return的区别 return返回的是一个list列表,而yield每次调用只返回一个数值,毫无疑问,使用return空间开销比较大,尤其是操作巨量数据的时候,操作一个大列表时间开销也会得不偿失 yield 生成器相比 return一次返回所有结果的优势: (1)反应更迅速 (2)更节省空间 (3)使用更灵活 到这里你可能就明白yield和return的关系和区别了,带yield的函数是一个生成器,而不是一个函数了,...

AcceptedLin的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python里的return用在循环里_Python-如何在for循环中使用return语句?

在循环中使用return将中断它并退出方法/函数,即使迭代仍未完成。例如:def num():# Here there will be only one iteration# For number == 1 => 1 % 2 = 1# So, break the loop and return the numberfor number in range(1, 10):if number % 2:r...

weixin_39898854的博客 2833

python中return和yield的区别

首先比较下return 与 yield的区别: return:在程序函数中返回某个值,返回之后函数不在继续执行,彻底结束。 yield: 带有yield的函数是一个迭代器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的re...

weixin_44108880的博客 4979

python里return,print,yield

今天看了一些迭代器和生成器的东西,觉得对这一块还是比较模糊,做个笔记吧~嗯嗯,国庆节在实验室过,真的很快乐哦(

Strive_0902的博客 1953

深度解析:Python生成器中yield与return的混合使用机制

在生成器函数中, 语句确实是通过抛出 异常来实现的,这是 Python 生成器协议的有意设计而非缺陷。这种机制实现了四个关键目标: 第一性原理:为什么要这样设计? 设计目标1:保持与迭代协议的兼容性 Python的迭代协议规定:所有迭代器在迭代完成时必须抛出StopIteration异常。 关键洞察:如果生成器的return不通过异常机制,就会破坏Python的迭代协议,导致与现有代码不兼容。 为什么不能用相同的机制? 设计目标3:支持 yield from 的高级用法 能够自动捕获子生成器的返回值,这

ningyanggege的博客 791

Python 2和3的区别--生成器return

日期:20170926本目录记录的是,我用Python2不能正确运行,而Python3可以的。或者用Python2能正确运行,而Python3不可以的。如果只是简单学Python编程的,可以直接学Python3,因为Python2貌似不更新了。 如果想深入学习Python或者以Python的工作的,那有很大几率会遇到Python 2的代码,所以有必要知道Python 2和3的不同点。 当然,如果

iPenX的博客 2312

python 什么时候用return_关于python:何时使用return(产生一些东西)?

很长一段时间我不知道你不能把return放在收益率声明前面。但实际上你可以:def gen():return (yield 42)它类似于def gen():yield 42return号我唯一能想到的用法是将发送值附加到StopIteration:pep-0380return expr in a generator causes StopIteration(expr) to be raisedu...

weixin_33773084的博客 1793
上一篇: 知乎高赞!女生单身久了身体会发生什么变化?Python来分析!
下一篇: 2021 年 Windows 成了 Python 开发者的首选
菜鸟学Python
博客等级 码龄9年 8044粉丝 571原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值