0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

带你一起学习彻底搞懂Python生成器

电子工程师 来源:lq 2019-02-25 09:13 次阅读

写在之前

Python 的高级语言特性一直是我们学习 Python 的一个难点,大部分人并没有做到熟练的掌握,甚至去学习它都感觉很困难,「生成器」作为其中甚是有用的特性之一,更是如此。

因为在其它的主流语言(C/C++/JAVA)中并没有生成器的概念,加之其具有一定的难度,学习起来花费的时间成本较大,很多人自我安慰式的视其为“鸡肋”,然后果断放弃如此有用的一个高级语言特性,实在是一件很惋惜的事情。

其实不光是对于「生成器」而言,对于其它的高级语言特性还是建议大家要花点时间去搞懂的,不说其它,这些东西作为面试中常考的内容也应该引起你的重视,毕竟公司不是傻瓜,没有用的东西干嘛要考你?

接下来就让我们来一起学习「生成器」,我尽量用大家都听的懂的话,层层递进的讲解,保证大家都能看懂,前提是要有耐心,文章较长,建议先收藏再看。

答应我,一定要有耐心。

迭代器

在这说「迭代器」的原因是「生成器」自动实现了「迭代器协议」,所谓协议,就是一种约定。为了更好的理解生成器,我们需要简单知道一下「迭代器协议」到底是个什么东西。其实只需要满足两个两个条件:1.实现 __iter__ 方法;2.对象实现 next() 方法,要么返回迭代中的下一项,要么就是以 StopIteration 异常终止迭代。

对象就是「可迭代对象」,即实现了迭代器协议的对象,它实现了迭代器协议。其实像是 Python 中 for 循环,sum 函数等等就是使用迭代器协议访问对象。

你可能看着有点懵,怎么又是「迭代」又是「迭代器」又是「可迭代对象」的,这对大家来说是很抽象的概念,但是不用怕,我在很久之前的文章中,已经很详细的介绍过这俩哥们,你只需要点击下面的链接去看就好了,这也是面试中常见的问题哦:

零基础学习 Python 之初识迭代

Python 拓展之迭代器

生成器

如果你理解了上一节的内容,那么恭喜你,接下来学习「生成器」就会简单很多。Python 使用生成器对「延迟操作」提供了支持,所谓「延迟操作」就是在需要它的时候才产生结果,而不是说立即产生结果。

首先我们先来看一个入门级别的版本,你只需要点击下面的链接即可:

零基础学习 Python 之初识生成器

接下来讲的相当于是上面文章的一个延伸和再拓展。

Python 其实有两种不同的方法来提供生成器,一种是函数形式,另一种是表达式形式,说全一点儿就是「生成器函数」和「生成器表达式」。

1.生成器函数

「生成器函数」和普通的函数定义类似。区别在于普通函数使用 return 返回结果,生成器函数是用yield返回结果。

yield的作用是在调用的时候返回相应的值,一次返回一个结果,在每个结果中间挂起函数的状态(即暂停执行),下一次执行是从上次暂停的位置开始,继续向下执行。

下面我们来做一道题,要求写出「将一个全是整数的列表进行操作后只保留奇数」。相信大多数人都能很快的写出下面这样的函数:

defget_odd(lst): res = [] foriinlst: ifi %2: res.append(i) returnresdefmain(): lst = range(10) foriinget_odd(lst): print(i)if__name__ =='__main__': main()

上面这个没什么难度,既然我们学了「生成器」,我在前面还这么舔它,是不是我们该用生成器来做一下这道题?看看用生成器来做同样的功能,到底有什么不同:

defget_odd(lst): foriinlst: ifi %2: yieldidefmain(): lst = range(10) foriinget_odd(lst): print(i)if__name__ =='__main__': main()

对比一下这个功能的两种做法,使用「生成器」以后,代码变的行数更少了(省去了对 res 的操作,不用把结果存在 res 里),代码整体看起来更清晰了(一看就知道干嘛的,不用一上来去想 res 是个什么鬼,append 进去的是个什么玩意儿)。

2.生成器表达式

「生成器表达式」和列表推导式类似。区别在于使用列表推导,一次会产生所有的结果,而用「生成器表达式」则不会这样,它是按需产生。

列表推导式的写法如下:

>>> res = [xforxinrange(5)]>>> res[0, 1, 2, 3, 4]

生成器表达式就是将上面的 [] 变成 () 即可:

>>> res = (xforxinrange(5))>>> res at 0x109d9f570>>>> next(res)0>>> next(res)1>>> next(res)2>>> next(res)3

我们也顺便简单的看一下「生成器」的优势在「生成器表达式」中是怎么体现的。如果我们想对一系列整数求和,直接用生成器可以写成下面这样:

>>> sum((xforxinrange(5)))10

当然为了方便起见,也可以省略圆括号,即写成下面这样:

>>> sum(xforxinrange(5))10

但是如果你用常规的写法去写,就会写成下面这样:

>>> sum([xforxinrange(5)])10

上面的代码先构造了一个列表,然后再用 sum 函数求和,多了一步,天差地别,光在时间效率上,就已经输掉了裤子。

所以综合上面文章所讲,「生成器」光在明面上的优点就有好几个:代码行数更少;代码更易读;时效更高...

所以,你还敢视它为“鸡肋”吗?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4273

    浏览量

    62290
  • 生成器
    +关注

    关注

    7

    文章

    313

    浏览量

    20933
  • python
    +关注

    关注

    54

    文章

    4763

    浏览量

    84338

原文标题:面试必备|带你彻底搞懂Python生成器

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    荣小菜补钙记第54期:报文序列生成器3

    本帖最后由 荣琪 于 2022-1-20 23:31 编辑 荣小菜补钙记第54期:报文序列生成器3同步更新于 WeChat:荣小菜在补钙欢迎关注 内容更丰富大家好,我是荣小菜,上期进行了报文
    发表于 01-07 22:49

    python生成器

    python生成器1. 什么是生成器生成器(英文名 Generator ),是个可以像迭代器那样使用for循环来获取元素的函数。
    发表于 02-24 15:56

    pim卡资料生成器

    pim卡资料生成器
    发表于 11-22 23:23 6次下载

    自制酸奶生成器

    自制酸奶生成器
    发表于 04-23 11:48 924次阅读
    自制酸奶<b class='flag-5'>生成器</b>

    LED段码生成器

    本文提供的LED段码生成器,希望对你的学习有所帮助!
    发表于 06-03 15:19 97次下载

    代码生成器的应用

    jeesite框架代码生成器,可以很方便的生成代码,挺不错的。
    发表于 01-14 15:19 0次下载

    STM32库函数代码自动生成器正式版

    STM32库函数代码自动生成器正式版 STM32库函数代码自动生成器正式版
    发表于 07-25 18:52 0次下载

    AN-113:精密坡道生成器

    AN-113:精密坡道生成器
    发表于 05-16 12:04 6次下载
    AN-113:精密坡道<b class='flag-5'>生成器</b>

    python生成器是什么

    python生成器 1. 什么是生成器生成器(英文名 Generator ),是个可以像迭代器那样使用for循环来获取元素的函数。
    的头像 发表于 02-24 15:53 3567次阅读

    Arduino赞美生成器

    电子发烧友网站提供《Arduino赞美生成器.zip》资料免费下载
    发表于 11-09 14:22 1次下载
    Arduino赞美<b class='flag-5'>生成器</b>

    将使用代码生成器生成的项目移植到与智能配置器一起使用的项目

    将使用代码生成器生成的项目移植到与智能配置器一起使用的项目
    发表于 01-11 19:00 0次下载
    将使用代码<b class='flag-5'>生成器</b><b class='flag-5'>生成</b>的项目移植到与智能配置器<b class='flag-5'>一起</b>使用的项目

    通用RFID生成器

    通用RFID生成器资料分享
    发表于 02-10 15:35 1次下载

    将使用代码生成器生成的项目移植到与智能配置器一起使用的项目

    将使用代码生成器生成的项目移植到与智能配置器一起使用的项目
    发表于 06-30 20:54 0次下载
    将使用代码<b class='flag-5'>生成器</b><b class='flag-5'>生成</b>的项目移植到与智能配置器<b class='flag-5'>一起</b>使用的项目

    Python中的生成器是什么?它们的效率和可用性如何?

    Python种以灵活性和多功能性着称的语言,它提供了种称为生成器的强大功能。
    发表于 07-19 14:33 461次阅读

    Python生成器的使用方法

    个例子,编写个函数计算串数字里所有偶数的个数,其实是很简单的问题,但是有些人是用生成器这么写的: In [ 66 ]: def f1 ( x ): ....: return s
    的头像 发表于 11-03 15:41 445次阅读