千锋教育-做有情怀、有良心、有品质的职业教育机构

Python生成表达式和列表解析

来源:千锋教育
发布时间:2023-11-07 01:53:59
分享

生成器表达式(Generatorexpression)和列表解析(ListComprehension)

绝大多数情况下,遍历一个集合都是为了对元素应用某个动作或是进行筛选。如果看过本文的第二部分,你应该还记得有内建函数map和filter提供了这些功能,但Python仍然为这些操作提供了语言级的支持。

(x+1forxinlst)#生成器表达式,返回迭代器。外部的括号可在用于参数时省略。

[x+1forxinlst]#列表解析,返回list

如你所见,生成器表达式和列表解析(注:这里的翻译有很多种,比如列表展开、列表推导等等,指的是同一个意思)的区别很小,所以人们提到这个特性时,简单起见往往只描述成列表解析。然而由于返回迭代器时,并不是在一开始就计算所有的元素,这样能得到更多的灵活性并且可以避开很多不必要的计算,所以除非你明确希望返回列表,否则应该始终使用生成器表达式。接下来的文字里我就不区分这两种形式了:)

你也可以为列表解析提供if子句进行筛选:

1(x+1forxinlstifx!=0)

或者提供多条for子句进行嵌套循环,嵌套次序就是for子句的顺序:

1((x,y)forxinrange(3)foryinrange(x))

列表解析就是鲜明的Pythonic。我常遇到两个使用列表解析的问题,本应归属于最佳实践,但这两个问题非常典型,所以不妨在这里提一下:

第一个问题是,因为对元素应用的动作太复杂,不能用一个表达式写出来,所以不使用列表解析。这是典型的思想没有转变的例子,如果我们将动作封装成函数,那不就是一个表达式了么?

第二个问题是,因为if子句里的条件需要计算,同时结果也需要进行同样的计算,不希望计算两遍,就像这样:

1(x.doSomething()forxinlstifx.doSomething()>0)

这样写确实很糟糕,但组合一下列表解析即可解决:

1(xforxin(y.doSomething()foryinlst)ifx>0)

内部的列表解析变量其实也可以用x,但为清晰起见我们改成了y。或者更清楚的,可以写成两个表达式:

tmp=(x.doSomething()forxinlst)

(xforxintmpifx>0)

列表解析可以替代绝大多数需要用到map和filter的场合,可能正因为此,著名的静态检查工具pylint将map和filter的使用列为了警告。

以上内容为大家介绍了Python生成表达式和列表解析,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • Python 解释器的作用 python解释器的主要作用是将我们在.py文件中写好的代码交给机器去执行,比较常见的解释器包括如下几种:CPython:官方解释器,我们从官网下载安装后获得的就是这个解释器,它使用C语言开发,是使用
  • Python 领域模型 python需求分析阶段不区分面向对象还是面向过程领域模型是完成从需求分析到面向对象设计的一座桥梁领域模型定义:领域模型是对领域内的概念或现实世界中对象的可视化表示,又称为观念模型,领域对象模型,分析
  • Python 图的功能 综述UML是数据库设计过程中,在E-R图(实体-联系图)的设计后的进一步建模。要了解一下UML设计中有的图例及基本作用。首先对UML中的各个图的功用做一个简单介绍:用例图描述角色以及角色与用例之间的连
  • 使用Python执行系统命令方法 Python是一款操作简单的编程语言,内置丰富的库,能够很容易的实现强大的功能,在使用Python进行框架搭建时,往往需要用到Python执行系统命令,一些开发人员对此不熟悉,以下是具体的操作方法:1
  • Python 的threading模块 python(CPython)提供了_thread和threading两个线程模块,_thread是低级模块,threading对_thread进行了封装,提高了_thread原有功能的易用性以及扩展
  • python 函数基础 一,函数是什么?函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程