yield-Python大牛必须掌握的高端语法
小白:大牛哥,刚才看到有一个函数不使用return返回结果,而是使用yield关键字返回结果,看不太明白,Python中yield关键字的用途是什么,它有什么作用呀?
大牛: 要想理解yield的作用,你必须了解什么是生成器(generators),了解生成器之前(generators)你需要先去了解什么是可迭代对象(iterables)。
大牛:小白啊,今天你大牛哥我刚好有空,给你说道说道这个yield的作用。让你开开眼界,看看我大牛都是怎么写出牛逼代码的。
小白:好呀好呀!!!
大牛:我们先来看看什么是可迭代对象(iterables)。
当你创建了一个列表,你可以遍历这个列表读取它的每一个元素,逐个读取列表元素的过程称为迭代(iteration)。
上面代码中 mylist 就是可迭代对象(iterables),使用列表推导式生成的对象也是可迭代对象
向这种可以使用for ... in .. 语法去迭代的对象都是可迭代对象。
大牛:小白,明白什么是可迭代对象了吗?你来说一说Python里面有那些常见的可迭代对象。
小白:明白了。可以使用for...in...获取里面元素的对象就是可迭代对象,像字典,列表,元组,字符串都是可迭代对象。大牛哥我说的没错吧!
大牛:给你32个赞!!不错,一点就通。知道什么是可迭代对象后继续来看生成器(generators)。
生成器是迭代器(iterators),但是只能迭代一次,生成器不会将所有值存储在内存中,而是实时的生成这些值:
将列推导式的 [] 改成了 () 其他并没有做任何改变,但是mygenerators已经不是列表,而是生成器。生成器迭代一次之后就不能再次迭代。计算出0,然后并不保存结果和状态继续计算出1,最后计算出4,逐一生成。
这只是创建生成器的一种方式,另外一种方式就是我们今天的主角yield关键字。
yield 是一个类似 return 的关键字。当我们调用这个函数的时候并不是返回计算的结果,而是返回一个生成器。只有迭代这个生成器的时候才会计算结果。
for i in mygenerator:第一次循环的时候函数执行到yield关键字位置,返回 i*i的值,然后将函数挂起(保存函数执行的状态)。for i in mygenerator:第二次循环的继续执行刚才的函数(挂起的位置),也就是执行生成器里面的for循环,返回i*i的值,然后再次将函数挂起。直到生成器里没有值可以返回就结束。
yield 可以返回值,但是不会结束函数的执行,如果函数后面还有代码,同样是可以执行的。
上面的函数其实没有什么作用,只是用来演示生成器用法。生成器在那些地方会用到呢?
比如需要创建一个非常大的列表直接使用列表推导式可能会导致内存被耗尽,这代码是创建不了列表,电脑内存不足以保存这个列表。
但是用生成器可以创建成功,需要使用的时候再从生成器中取出。
对比下面这两段代码:求1-10的偶数
大部分人的写法是这样的
大牛的写法是这样子的
同样的功能,但是用生成器要简便很多。
yield 的好处:
1.不会将所有数据取出来存入内存中;而是返回了一个对象;可以通过对象获取数据;用多少取多少,可以节省内存空间。
2.除了能返回一个值,还不会终止循环的运行
大牛:咳咳!一口气讲了这么多,差点就要把大牛我累挂了。小白同学,听明白了吗?
小白:哦,原来yield是这么个用法。谢谢大牛哥!经大牛哥这么一说,我发现以前我写的代码很多都可以用yield写成生成器啊!就拿你上面求偶数例子吧,采用yield的写法效率是否比普通写法高呢?
大牛:效率肯定比较高的,看下面的对比
def test(): |
0.8925411701202393 # 生成器写法耗时
1.1444191932678223 # 普通写法耗时
小白:哇!老板就经常嫌弃我写的代码执行效率低,每次我都是拿Python本身执行效率就比较低的理由去搪塞老板,原来还可以在这些细节上做优化的。
小白:听大牛哥一席话,胜读一本Python核心编程。老板叫我回去改BUG了 emememem。
大牛:坐看庭前花开花落,笑看天边云卷云舒。泡一杯咖啡,坐等下班。
产品经理:大牛,你写的代码又出BUG了,还不赶紧回来看看。你是不想下班了吧!
大牛:哎,来了,来了。
yield-Python大牛必须掌握的高端语法的更多相关文章
- Python大牛开小灶,一对一问答
CSDN知识小饭桌 大牛开小灶 小范围,高质量,在线交流QA 参与嘉宾 知识库特邀编辑伊海波,滴滴出行工程师,曾任龙图龙图游戏数据分析部技术负责人.CSDN博客专家,资深Python/Golang ...
- 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看)
前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就先带大家开发一个最简单低端的爬虫,突破携程网超 ...
- 【转】 基于C#.NET的高端智能化网络爬虫 2
[转] 基于C#.NET的高端智能化网络爬虫2 本篇故事的起因是携程旅游网的一位技术经理,豪言壮举的扬言要通过他的超高智商,完美碾压爬虫开发人员,作为一个业余的爬虫开发爱好者,这样的言论我当然不能置之 ...
- 【转】 基于C#.NET的高端智能化网络爬虫
[转] 基于C#.NET的高端智能化网络爬虫 前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就 ...
- Python语言及其应用|PDF高清完整版免费下载|百度云盘|Python
百度云盘:Python语言及其应用PDF高清完整版免费下载 提取码:6or6 内容简介 本书介绍Python 语言的基础知识及其在各个领域的具体应用,基于最新版本3.x.书中首先介绍了Python 语 ...
- Python语言及其应用PDF高清完整版免费下载|百度云盘|Python新手入门
百度云盘:Python语言及其应用PDF高清完整版免费下载 提取码:6or6 内容简介 本书介绍Python 语言的基础知识及其在各个领域的具体应用,基于最新版本3.x.书中首先介绍了Python 语 ...
- Python10行以内代码能有什么高端操作
Python10行以内代码能有什么高端操作 Python凭借其简洁的代码,赢得了许多开发者的喜爱.因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代 ...
- 豆芽儿 - 高端IT人才成长社区 上线啦!
豆芽儿 - 高端IT人才成长社区 这是我们新打造的网站,全新设计了用户体验,给你更爽快的学习体验.为你分享敏捷开发.项目管理.需求分析.软件设计.UML.中层领导力.CMMI.IT职场等“高大上” ...
- Linux培训薪资过万是真事 星创客为嵌入式高端培训树标杆
10月26日,是华清远见星创客嵌入式精英训练营首期班结业后的第15个工作日,虽然目前的学员就业成果已经超出了训练营老师们的预期,但就业工作仍然在继续进行着没有停止. 从训练营老师方面得出的统计数据,截 ...
随机推荐
- 获取sender进程所产生的trace文件
直接开启数据库实例级别的sql_trace是不现实的,会对所有连接到oracle的session都产生sql_trace,这样会产生大量的trace文件(垃圾文件),因此为跟踪特定进程的sql信息,可 ...
- Flask【第4篇】:用Flask的扩展实现的简单的页面登录
用flask的扩展实现的简单的页面登录 from flask import Flask,render_template,request,redirect,session app = Flask(__n ...
- [转帖]ssh 远程执行命令
ssh 远程执行命令 https://www.cnblogs.com/youngerger/p/9104144.html SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是 ...
- 【NOIP2015模拟11.3】IOIOI卡片占卜
题目 K理事长很喜欢占卜,经常用各种各样的方式进行占卜.今天,他准备使用正面写着"I",反面写着"O"的卡片为今年IOI的日本代表队占卜最终的成绩. 占卜的方法 ...
- 链表中倒数第k个节点(python)
题目描述 输入一个链表,输出该链表中倒数第k个结点. 无力吐槽牛客网... class Solution: def FindKthToTail(self, head, k): # write code ...
- nginx 静态资源WEB服务
1.静态资源类型 非服务器动态运行生成的文件 类型种类 浏览器端渲染 HTML.CSS.JS 图片 JPEG.GIF.PNG 视频 FLV.MPEG ...
- JAVA-IO模型(BIO,NIO,AIO)
基本概念 阻塞和非阻塞 阻塞是进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待, 直到有东西可读或者可写为止 非阻塞是如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等 ...
- 内存地址 Memory Management
Memory Management https://docs.python.org/2/c-api/memory.html Memory management in Python involves a ...
- winform最小化及添加右键
private void PrintService_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWind ...
- EF2:Entity Mysql Sample
1)概念 Entity Framework: 全称ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架.百 ...