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中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 Python
Python实现提取谷歌音乐搜索结果的方法
Jul 10 Python
python脚本设置系统时间的两种方法
Feb 21 Python
python中pip的安装与使用教程
Aug 10 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
详解python读取和输出到txt
Mar 29 Python
对django 模型 unique together的示例讲解
Aug 06 Python
通过实例了解python property属性
Nov 01 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 Python
python 实现两个线程交替执行
May 02 Python
解决c++调用python中文乱码问题
Jul 29 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 GD绘制24小时柱状图
2008/06/28 PHP
基于php无限分类的深入理解
2013/06/02 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
PHP正则验证Email的方法
2015/06/15 PHP
cakephp常见知识点汇总
2017/02/24 PHP
php json转换相关知识(小结)
2018/12/21 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
javascript 面向对象编程 function也是类
2009/09/17 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
Python处理CSV与List的转换方法
2018/04/19 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
Flask之flask-session的具体使用
2018/07/26 Python
python 多线程串行和并行的实例
2019/02/22 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
python Xpath语法的使用
2020/11/26 Python
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
Weblogic和WebSphere不同特点
2012/05/09 面试题
销售行业个人求职自荐信
2013/09/25 职场文书
年级组长自我鉴定
2014/02/22 职场文书
晨会主持词
2014/03/17 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
个人批评与自我批评
2014/10/15 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
个人总结格式范文
2015/03/09 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
导游词之日月潭
2019/11/05 职场文书
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python