小白:大牛哥,刚才看到有一个函数不使用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. 路径path知识点

    1. 获取当前文件的路径 test.py os.path.abspath(path) # 返回当前文件运行的绝对路径 print("程序的绝对路径是",os.path.abspat ...

  2. 【Linux】CentOS6安装jdk1.8

    1.查看官网下载地址 接受协议后,点击下载链接 查看发出的请求,获得下载地址 其中后面的AuthParam参数为本次下载的即时参数,每次都不一样 2.下载安装包 下载完后改个名 wget https: ...

  3. Codeforces 916B Jamie and Binary Sequence ( 模拟 && 思维 )

    题意 : 给出一个数 n ,要求你用 k 个二的幂来组成这个数,要求输出这 k 个二的幂的指数,如果有多解情况则优先输出最大指数最小的那一个且要求按字典序输出,不存在则输出 No 分析 :  先来说一 ...

  4. 【学习心得】Link-cut Tree

    Link-cut Tree是一种支持改变树(森林)的形态(link和cut),同时维护树的路径上节点信息的数据结构.lct通过splay来维护每次的perferred path,说白了就是一个动态的树 ...

  5. 【PowerOJ1744&网络流24题】方格取数问题(最小割)

    题意: n,m<=30 思路: [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图X集合中顶点 ...

  6. Node 资源

    Node.js 首页 最新的 Node.js 核心文档 Node.js 博客 Node.js 职位公告板 Node.js 包管理器(npm)的首页

  7. Bazinga

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  8. idea创建项目和依赖

    创建项目和依赖 项目搭建完成后打开web.xml可看到如图使用的是servlet2.3,但版本太老,servlet2.3 jsp  的el表达式不工作,所以我们需要切换新版本. 切换新版本方法:打开t ...

  9. 树莓派安装配置teamviewer host

    过程: 下载teamviewer,直接到teamviewer的官网上直接下载 下载完后,安装teamviewerw sudo dpkg -i 下载的文件的路径+文件名 安装完后会提示存在依赖问题,修复 ...

  10. React-Native 之 GD (十四)小时风云榜 及 当前时间操作 及 上一小时、下一小时功能实现

    1.小时风云榜 GDHourList.js /** * 小时风云榜 */ import React, { Component } from 'react'; import { StyleSheet, ...