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 相关文章推荐
Python3处理文件中每个词的方法
May 22 Python
Apache如何部署django项目
May 21 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
Django如何自定义model创建数据库索引的顺序
Jun 20 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
python虚拟环境完美部署教程
Aug 06 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
Python yield生成器和return对比代码实例
Apr 20 Python
Python logging模块handlers用法详解
Aug 14 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 Python
Python实现随机生成迷宫并自动寻路
Jun 13 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 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实现的下载css文件中的图片的代码
2010/02/08 PHP
php连接数据库代码应用分析
2011/05/29 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
php批量修改表结构实例
2017/05/24 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
JS 继承实例分析
2008/11/04 Javascript
JavaScript库 开发规则
2009/01/31 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
采用call方式实现js继承
2014/05/20 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
javascript中UMD规范的代码推演
2018/08/29 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
js实现时间日期校验
2020/05/26 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
Python之eval()函数危险性浅析
2014/07/03 Python
python中星号变量的几种特殊用法
2016/09/07 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
Pretty Green美国:英式摇滚服饰风格代表品牌之一
2019/01/23 全球购物
学生感冒英文请假条
2014/02/04 职场文书
社会发展项目建议书
2014/08/25 职场文书
公证委托书格式
2014/09/13 职场文书
酒店辞职书范文
2015/02/26 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书