写在前面:内容参照自《Effective Python》,其实你完全可以直接去看书,什么?你不想自己看书,那么你也可以关注我,我会不定期从书中挑出常用到的有效方法分享出来,这样你就可以一边刷头条,一边学习知识,岂不美哉。

正文

如果函数要产生一系列结果,那么最简单的做法就是把这些结果都放在一份列表里,并将其返回给调用者。例如,我们要查出字符串中每个词的首字母,在整个字符串里的位置。下面这段代码,用 append 方法将这些词的首字母索引添加到 result 列表中,并在函数结束时将其返回给调用者。

输入一些范例值,以验证该函数能够正常运作:

上面的 index_words 函数有两个问题。

第一个问题是,这段代码写得有点拥挤。每次找到新的结果,都要调用 append 方法。但我们真正应该强调的,并不是对 result.append 方法的调用,而是该方法给列表中添加的那个值,也就是 index+1。另外,函数首尾还各有一行代码用来创建及返回 result 列表。于是,在函数主体部分的约 130 个字符(不计空白字符)里,重要的大概只有 75 个。

这个函数改用生成器(generator)来写会更好。生成器是使用 yield 表达式的函数。调用生成器函数时,它并不会真的运行,而是会返回迭代器。每次在这个迭代器上面调用内置的 next 函数时,迭代器会把生成器推进到下一个 yield 表达式那里。生成器传给 yield 的每一个值,都会由迭代器返回给调用者。

下面的这个生成器函数,会产生和刚才那个函数相同的效果:

这个函数不需要包含与 result 列表相交互的那些代码,因而看起来比刚才那种写法清晰许多。原来那个 result 列表中的元素,现在都分别传给 yield 表达式了。调用该生成器后所返回的迭代器,可以传给内置的 list 函数,以将其转换为列表(关于生成器可以查看:python 学习 生成器)。

index_words 函数的第二个问题是,它在返回前,要先把所有结果都放在列表里面。如果输入量非常大,那么程序就有可能耗尽内存并崩溃。相反,用生成器改写后的版本,则可以应对任意长度的输入数据。

下面定义的这个生成器,会从文件里面依次读入各行内容,然后逐个处理每行中的单词,并产生相应结果。该函数执行时所耗的内存,由单行输入值的最大字符数来界定。

运行这个生成器函数,也能产生和原来相同的效果。

要点

  • 使用生成器比把收集到的结果放入列表里返回给调用者更加清晰。
  • 由生成器函数所返回的那个选代器,可以把生成器函数体中,传给 yield 表达式的那些值,逐次产生出来。
  • 无论输入量有多大,生成器都能产生一系列输出,因为这些输入量和输出量,都不会影响它在执行时所耗的内存。

append函数_高质量python代码:考虑用生成器来改写直接返回列表的函数相关推荐

  1. python代码编写_高质量Python代码编写的5个优化技巧

    如今我使用 Python 已经很长时间了,但当我回顾之前写的一些代码时,有时候会感到很沮丧.例如,最早使用 Python 时,我写了一个名为 Sudoku 的游戏(GitHub地址:https://g ...

  2. 表示python代码块的是_编写高质量Python代码的59个有效方法,你用过几个

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...

  3. python中如何编写代码输入多个数据并把它们放在一个列表中去_编写高质量Python代码的59个有效方法,你用过几个...

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.PDF电子文档.面试集锦.学习资料等. 这个周末断断续续的阅读完了<Effectiv ...

  4. python中如何编写代码输入多个数据并把它们放在一个列表中去_这59条编写高质量Python代码的方法你知道吗?...

    这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码的59个有效方法>,感觉还不错,具有很大的指导价值. 下面将以最简单的方式记录这59条建议,并在大部 ...

  5. python代码续航的方法_编写python高质量python代码的59个有效方法

    第1条:确认自己的python版本 第2条:遵循PEP8的风格 1.空格 对于 占据多行的长表达式来说, 除了首行之外的其余各行都应该在通常的缩进级别上再加4个空格. 每行字符数不应该超过79. 2. ...

  6. 编写python高质量python代码的59个有效方法

    第1条:确认自己的python版本 第2条:遵循PEP8的风格 1.空格 对于 占据多行的长表达式来说, 除了首行之外的其余各行都应该在通常的缩进级别上再加4个空格. 每行字符数不应该超过79. 2. ...

  7. Python -- Effective Python:编写高质量Python代码的59个有效方法

    第 1 章 用 Pythonic 方式来思考 第 1 条:确认自己所用的 Python 版本 python --version import sys print(sys.version_info) p ...

  8. 《Effective Python 编写高质量Python代码的59个有效方法》读书笔记

    具体的59条 第 1 章 用 Pythonic 方式来思考 1 第 1 条:确认自己所用的 Python 版本 1 第 2 条:遵循 PEP 8 风格指南 3 第 3 条:了解 bytes. str ...

  9. python编写代码避免内存增加_读书笔记(6): 编写高质量python代码的59个有效方法-完结...

    前言 <编写高质量python代码的59个有效方法>这本书分类逐条地介绍了编写python代码的有效思路和方法,对理解python和提高编程效率有一定的帮助.本笔记简要整理其中的重要方法. ...

最新文章

  1. vm虚拟机和windows共享文件夹
  2. python 匹配字符串多个_在Python中匹配多个数据集的字符串
  3. SQL2K数据库开发三十之存储过程操作删除存储过程
  4. 蓝桥杯基础模块3_1:数码管静态显示
  5. 长春南关区净月大街附近都有哪些课后班?
  6. 新编标准日本语 第26课 课文
  7. No module named 'crispy_forms'等使用pycharm开发
  8. 【英语学习】【Daily English】U04 Neighborhood L01 Anything else around?
  9. ICH E2B | ICSR 电子传输网关对接解决方案(CDE EDI)
  10. 卷组删除pv_LVM 移除PV步骤
  11. 仙剑奇侠传3 全开注册表改法
  12. 网络爬虫-爬取有效机构查询网(CNAS)全量数据
  13. js常见创建对象的三种方式
  14. OpenLayers 4 ol.source 详解
  15. 机械革命 键盘灯 linux,机械革命x6Ti安装ubuntu(100%成功)
  16. 英特尔和瑞芯微合作发布面向入门市场的XMM6321双核处理器
  17. 视频教程-SpringBoot实战开发视频-Java
  18. Java共享充电宝地图应用_基于jsp的共享充电宝-JavaEE实现共享充电宝 - java项目源码...
  19. 是真烧机油还是正常磨损
  20. 游戏软件功能测试用例编写

热门文章

  1. Selenium3自动化测试——19.读取数据文件
  2. 让计算机自己写作文,写电脑的作文300字左右
  3. ajax获取php cookie,Ajax 无法跨域获取 cookie
  4. java需要前台封装对象吗_javaEE之-----------类反射直接封装前台传过来的参数
  5. 短信自动转发到另一个手机_以 wmghz.com 为例,简单实现打一个网址自动就转到另一个网址...
  6. 大一期末计算机应用基础考什么,大学计算机应用基础期末考试题
  7. 每天一个linux命令(17):whereis 命令
  8. 从入门到精通系列Java高级工程师路线介绍,附答案
  9. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY16-强化学习
  10. mysql编辑表php源码_MySQL修改表的实际应用代码示例