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获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
python删除文件示例分享
Jan 28 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
python配置grpc环境
Jan 01 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
Python如何使用27行代码绘制星星图
Jul 20 Python
Python实现智慧校园自动评教全新版
Jun 18 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 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
PHP环境搭建最新方法
2006/09/05 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
探讨如何在PHP开启gzip页面压缩实例
2013/06/09 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
php报错502badgateway解决方法
2019/10/11 PHP
js 函数调用模式小结
2011/12/26 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
Python3中的2to3转换工具使用示例
2015/06/12 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
个人素质的自我评价分享
2013/12/16 职场文书
教师求职自荐信
2014/03/09 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python
Python使用openpyxl模块处理Excel文件
2022/06/05 Python