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

 更新时间:2016年03月10日 11:38:56   投稿:hebedich  
最近在学习python的过程中,对列表解析及生成器表达式有点疑惑。从表面上看,两者很相似,只有一点不同:列表解析采用中括号[]来包含,生成器表达式采用小括号()来包含。本文我们就来详细看下python生成器表达式和列表解析

绝大多数情况下,遍历一个集合都是为了对元素应用某个动作或是进行筛选。如果看过本文的第二部分,你应该还记得有内建函数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 pandas 分组统计的方法

    详解python pandas 分组统计的方法

    这篇文章主要介绍了详解pandas python 分组统计的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python实现生成指定大小文件的示例详解

    Python实现生成指定大小文件的示例详解

    这篇文章主要为大家详细介绍了Python如何实现生成指定大小文件,例如txt/图片/视频/csv等,文中的示例代码讲解详细,需要的可以参考下
    2023-08-08
  • Python进阶之尾递归的用法实例

    Python进阶之尾递归的用法实例

    本篇文章主要介绍了Python进阶之尾递归的用法实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Python pydotplus安装及可视化图形创建教程

    Python pydotplus安装及可视化图形创建教程

    这篇文章主要为大家介绍了Python pydotplus安装及可视化图形创建教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • python 多线程与多进程效率测试

    python 多线程与多进程效率测试

    这篇文章主要介绍了python 多线程与多进程效率测试,在Python中,计算密集型任务适用于多进程,IO密集型任务适用于多线程、接下来看看文章得实例吧,需要的朋友可以参考一下哟
    2021-10-10
  • Python2.x利用commands模块执行Linux shell命令

    Python2.x利用commands模块执行Linux shell命令

    这篇文章主要介绍了Python2.x利用commands模块执行Linux shell命令 的相关资料,需要的朋友可以参考下
    2016-03-03
  • python绘图方法实例入门

    python绘图方法实例入门

    这篇文章主要介绍了python绘图方法,实例分析了Python的绘图技巧,涉及Python中matplotlib模块的使用方法,需要的朋友可以参考下
    2015-05-05
  • python实现决策树分类

    python实现决策树分类

    这篇文章主要为大家详细介绍了python实现决策树分类的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Pycharm激活码激活两种快速方式(附最新激活码和插件)

    Pycharm激活码激活两种快速方式(附最新激活码和插件)

    这篇文章主要介绍了Pycharm两种快速激活方式(附最新激活码和插件) ,本文给大家分享两种方式,小编在文章给大家推荐方法二,大家可以根据自己需要选择,感兴趣的朋友跟随小编一起看看吧
    2020-03-03
  • pyEcharts安装及详细使用指南(最新)

    pyEcharts安装及详细使用指南(最新)

    这篇文章主要介绍了pyEcharts安装及详细使用指南(最新),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论