小白:大牛哥,刚才看到有一个函数不使用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. python-类对象的比较

    #类对象的比较 class Person: def __init__(self,age,height): self.age=age self.height=height def __eq__(self ...

  2. jquery编写插件(转)

    教你开发jQuery插件(转)   阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...

  3. Jackson常用工具类

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11983194.html Demo package org.fool.util; import com. ...

  4. ckeditor直接粘贴图片实现

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...

  5. 【bzoj1093】 [ZJOI2007]最大半连通子图

    *题目描述: 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路 ...

  6. 个推一键认证SDK重磅推出,打造秒级登录体验,让用户一“键”倾心

    移动互联网时代,用户注意力的持续时间越来越短,他们追求便捷与高效.从账号密码登录.短信验证,到第三方登录甚至人脸识别登录,APP的注册/登录方式在逐步变化,开发者希望在这重要的交互端口提升用户的体验, ...

  7. 最新版本的MySQL的下载和安装(Release: 8.0.12)

    1.打开百度搜索[Myql],或直达官网https://dev.mysql.com/ 2.点选[Download按钮],跳转到下载页面,拉到底部再点选[Community Download]社区版[免 ...

  8. python 网络编程 代码版

    写博客最怕写什么? 系统原理,框架内核... #!/usr/bin/env python # -*- coding:utf-8 -*- import socket sk = socket.socket ...

  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_8_字节输入流_InputStream类&FileInputStream

    inputStream

  10. 博客图片上传picgo工具安装配置github图传使用

    摘要 对于每一个写博客的人来说,图片是至关重要.这一路经历了多次图片的烦恼,之前选择了微博个人文章那里粘贴图片的方式上传,感觉也挺方便的.但是由于新浪的图片显示问题,如果header中不设置 标签就不 ...