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 注释:解释和优化代码可读性

    Python 注释:解释和优化代码可读性

    本文将探讨Python中注释的重要性,以及如何通过注释解释和优化代码的可读性,了解如何正确使用注释可以提高代码的可维护性和可理解性
    2023-09-09
  • Python中最好用的json库orjson用法详解

    Python中最好用的json库orjson用法详解

    orjson是一个用于python的快速、正确的json库,它的基准是 json最快的python库,具有全面的单元、集成和互操作性测试,下面这篇文章主要给大家介绍了关于Python中最好用的json库orjson用法的相关资料,需要的朋友可以参考下
    2022-06-06
  • YOLOv5车牌识别实战教程(一)引言与准备工作

    YOLOv5车牌识别实战教程(一)引言与准备工作

    这篇文章主要介绍了YOLOv5车牌识别实战教程(一)引言与准备工作,在这个教程中,我们将一步步教你如何使用YOLOv5进行车牌识别,帮助你快速掌握YOLOv5车牌识别技能,需要的朋友可以参考下
    2023-04-04
  • 20行Python代码实现一款永久免费PDF编辑工具

    20行Python代码实现一款永久免费PDF编辑工具

    本文主要介绍了Python代码实现一款永久免费PDF编辑工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • python网络编程之多线程同时接受和发送

    python网络编程之多线程同时接受和发送

    这篇文章主要为大家详细介绍了python网络编程之多线程同时接受和发送,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Python字典对象实现原理详解

    Python字典对象实现原理详解

    这篇文章主要介绍了Python字典对象实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python startswith()和endswith() 方法原理解析

    Python startswith()和endswith() 方法原理解析

    这篇文章主要介绍了Python startswith()和endswith() 方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Python将xml和xsl转换为html的方法

    Python将xml和xsl转换为html的方法

    这篇文章主要介绍了Python将xml和xsl转换为html的方法,实例分析了使用libxml2模块操作xml和xsl转换为html的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 使用PyInstaller将Python程序文件转换为可执行程序文件

    使用PyInstaller将Python程序文件转换为可执行程序文件

    与py2exe一样,PyInstaller程序也可以将Python的.py程序文件转换为.exe,并且还有Linux的版本,下面我们就来详细看一下如何使用PyInstaller将Python程序文件转换为可执行程序文件
    2016-07-07
  • Python实现滑块验证码详解

    Python实现滑块验证码详解

    验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现,今天给大家分享一篇Python实现滑块验证码
    2022-05-05

最新评论