python生成器表达式和列表解析


Posted in Python onMarch 10, 2016

绝大多数情况下,遍历一个集合都是为了对元素应用某个动作或是进行筛选。如果看过本文的第二部分,你应该还记得有内建函数map和filter提供了这些功能,但Python仍然为这些操作提供了语言级的支持。

(x+1 for x in lst) #生成器表达式,返回迭代器。外部的括号可在用于参数时省略。 
[x+1 for x in lst] #列表解析,返回list

如你所见,生成器表达式和列表解析(注:这里的翻译有很多种,比如列表展开、列表推导等等,指的是同一个意思)的区别很小,所以人们提到这个特性时,简单起见往往只描述成列表解析。然而由于返回迭代器时,并不是在一开始就计算所有的元素,这样能得到更多的灵活性并且可以避开很多不必要的计算,所以除非你明确希望返回列表,否则应该始终使用生成器表达式。接下来的文字里我就不区分这两种形式了:)

你也可以为列表解析提供if子句进行筛选:

(x+1 for x in lst if x!=0)

或者提供多条for子句进行嵌套循环,嵌套次序就是for子句的顺序:

((x, y) for x in range(3) for y in range(x))

列表解析就是鲜明的Pythonic。我常遇到两个使用列表解析的问题,本应归属于最佳实践,但这两个问题非常典型,所以不妨在这里提一下:

第一个问题是,因为对元素应用的动作太复杂,不能用一个表达式写出来,所以不使用列表解析。这是典型的思想没有转变的例子,如果我们将动作封装成函数,那不就是一个表达式了么?

第二个问题是,因为if子句里的条件需要计算,同时结果也需要进行同样的计算,不希望计算两遍,就像这样:

(x.doSomething() for x in lst if x.doSomething()>0)

这样写确实很糟糕,但组合一下列表解析即可解决:

(x for x in (y.doSomething() for y in lst) if x>0)

内部的列表解析变量其实也可以用x,但为清晰起见我们改成了y。或者更清楚的,可以写成两个表达式:

tmp = (x.doSomething() for x in lst)
(x for x in tmp if x > 0)

列表解析可以替代绝大多数需要用到map和filter的场合,可能正因为此,著名的静态检查工具pylint将map和filter的使用列为了警告。

Python 相关文章推荐
Python中的lstrip()方法使用简介
May 19 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
python用户评论标签匹配的解决方法
May 31 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
用Python实现将一张图片分成9宫格的示例
Jul 05 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
对python中UDP,socket的使用详解
Aug 22 Python
pycharm显示远程图片的实现
Nov 04 Python
Python3 Click模块的使用方法详解
Feb 12 Python
基于Python的EasyGUI学习实践
May 07 Python
用Python将GIF动图分解成多张静态图片
Jun 11 Python
python迭代器与生成器详解
Mar 10 #Python
Python装饰器基础详解
Mar 09 #Python
Python求算数平方根和约数的方法汇总
Mar 09 #Python
Python实现Linux命令xxd -i功能
Mar 06 #Python
基于Python实现一个简单的银行转账操作
Mar 06 #Python
Python切片知识解析
Mar 06 #Python
Django Admin实现上传图片校验功能
Mar 06 #Python
You might like
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
你应该知道PHP浮点数知识
2015/05/13 PHP
php生成动态验证码gif图片
2015/10/19 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
js数组的操作详解
2013/03/27 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
python 读取文件并替换字段的实例
2018/07/12 Python
对python 调用类属性的方法详解
2019/07/02 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
个人务虚会发言材料
2014/10/20 职场文书
捐款感谢信
2015/01/20 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL