小白:大牛哥,刚才看到有一个函数不使用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():
    for i in range(1, 11000000):
        if i % 2 == 0:
            yield i
def test1():
    result = []
    for i in range(1, 11000000):
        if i % 2 == 0:
            result.append(i)
    return result

0.8925411701202393   # 生成器写法耗时

1.1444191932678223   # 普通写法耗时

小白:哇!老板就经常嫌弃我写的代码执行效率低,每次我都是拿Python本身执行效率就比较低的理由去搪塞老板,原来还可以在这些细节上做优化的。

小白:听大牛哥一席话,胜读一本Python核心编程。老板叫我回去改BUG了 emememem。

大牛:坐看庭前花开花落,笑看天边云卷云舒。泡一杯咖啡,坐等下班。

产品经理:大牛,你写的代码又出BUG了,还不赶紧回来看看。你是不想下班了吧!

大牛:哎,来了,来了。

yield-Python大牛必须掌握的高端语法的更多相关文章

  1. Python大牛开小灶,一对一问答

    CSDN知识小饭桌 大牛开小灶 小范围,高质量,在线交流QA 参与嘉宾   知识库特邀编辑伊海波,滴滴出行工程师,曾任龙图龙图游戏数据分析部技术负责人.CSDN博客专家,资深Python/Golang ...

  2. 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看)

    前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就先带大家开发一个最简单低端的爬虫,突破携程网超 ...

  3. 【转】 基于C#.NET的高端智能化网络爬虫 2

    [转] 基于C#.NET的高端智能化网络爬虫2 本篇故事的起因是携程旅游网的一位技术经理,豪言壮举的扬言要通过他的超高智商,完美碾压爬虫开发人员,作为一个业余的爬虫开发爱好者,这样的言论我当然不能置之 ...

  4. 【转】 基于C#.NET的高端智能化网络爬虫

    [转] 基于C#.NET的高端智能化网络爬虫 前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就 ...

  5. Python语言及其应用|PDF高清完整版免费下载|百度云盘|Python

    百度云盘:Python语言及其应用PDF高清完整版免费下载 提取码:6or6 内容简介 本书介绍Python 语言的基础知识及其在各个领域的具体应用,基于最新版本3.x.书中首先介绍了Python 语 ...

  6. Python语言及其应用PDF高清完整版免费下载|百度云盘|Python新手入门

    百度云盘:Python语言及其应用PDF高清完整版免费下载 提取码:6or6 内容简介 本书介绍Python 语言的基础知识及其在各个领域的具体应用,基于最新版本3.x.书中首先介绍了Python 语 ...

  7. Python10行以内代码能有什么高端操作

    Python10行以内代码能有什么高端操作 Python凭借其简洁的代码,赢得了许多开发者的喜爱.因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代 ...

  8. 豆芽儿 - 高端IT人才成长社区 上线啦!

      豆芽儿 - 高端IT人才成长社区 这是我们新打造的网站,全新设计了用户体验,给你更爽快的学习体验.为你分享敏捷开发.项目管理.需求分析.软件设计.UML.中层领导力.CMMI.IT职场等“高大上” ...

  9. Linux培训薪资过万是真事 星创客为嵌入式高端培训树标杆

    10月26日,是华清远见星创客嵌入式精英训练营首期班结业后的第15个工作日,虽然目前的学员就业成果已经超出了训练营老师们的预期,但就业工作仍然在继续进行着没有停止. 从训练营老师方面得出的统计数据,截 ...

随机推荐

  1. ubuntu16.04 开启FTP服务

    配置ftp 1.安装 vsftpd服务器 sudo apt install vsftpd 2.创建一个ftp文件夹 (可以跳过) sudo mkdir /home/ftp 3.新建ftp用户,并指向它 ...

  2. java:序列化Serializable 接口

    java:序列化Serializable 接口 public class SerializePerson implements Serializable { private String name; ...

  3. mysql分组排序加序号(不用存储过程,就简简单单sql语句哦)

    做前端好长时间了,好久没动sql了.在追一个喜欢的女孩,做测试的,有这么个需求求助与本屌丝,机会难得,开始折腾起来,配置mysql,建库,建表.... 一 建表 CREATE TABLE `my_te ...

  4. 转:HTML5 History API 详解

    从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...

  5. es之词库热更新解决方案

    1. 下载tomcat,作为远程词库的容器 , 需要在tomcat中配置词库 /webapp/ROOT这个路径下新建一个远程词库:​Vim hot.dicHot.dic中存放的就是实时热词 2.测试t ...

  6. Spark Streaming的优化之路—从Receiver到Direct模式

    作者:个推数据研发工程师 学长     1 业务背景   随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来进行分析.决 ...

  7. Parse error: syntax error, unexpected 'class' (T_CLASS)

    电脑坏了重新下载代码. 结果报错 Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_ST ...

  8. P1538迎春舞会之数字舞蹈

    传送 输入输出样例:(洛咕的太丑了就不放了) (1前面有三个空格) 这真是一群闲(qian)圈(zou)的人.大号+小号提交了不下10遍终于a了 好了我们来研究一下这些数字"美观" ...

  9. How to derive mean and variance of a Gaussian?

    PRML exercise 1.8: To derive mean: change of variable z = x - u, use symmetry To derive variance: di ...

  10. spring boot添加logging不能启动且不报错

    1.问题: application.yml中添加logging启动失败,不报错,去除后又正常 logging: config: classpath:test-logback-spring.xml报错 ...