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 threading模块操作多线程介绍
Apr 08 Python
python 美化输出信息的实例
Oct 15 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
Python列表(List)知识点总结
Feb 18 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
使用django实现一个代码发布系统
Jul 18 Python
python实现按首字母分类查找功能
Oct 31 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 Python
python 如何区分return和yield
Sep 22 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 file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
php session劫持和防范的方法
2013/11/12 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
pycharm远程调试openstack的图文教程
2017/11/21 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
python文件读取失败怎么处理
2020/06/23 Python
基于python实现操作git过程代码解析
2020/07/27 Python
通过代码实例了解Python sys模块
2020/09/14 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Python timeit模块原理及使用方法
2020/10/10 Python
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
小学毕业感言500字
2014/02/28 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript
python数字转对应中文的方法总结
2021/08/02 Python