Python生成表达式和列表解析
生成器表达式(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培训机构:千锋教育。

相关推荐HOT
更多>>
Python企业应用的优缺点
Python是软件开发领域一朵诱人的奇葩:人们经常把Python看作是一种起到缝合作用的严格脚本语言,不过却很少有人意识到Python已经足够强大到应用...详情>>
2023-11-11 21:01:20
Python 之什么是类,什么是对象?
类即类别、种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体。那么...详情>>
2023-11-11 18:20:34
Python 爬虫之pyspider
pyspider是一个支持任务监控、项目管理、多种数据库,具有WebUI的爬虫框架,它采用Python语言编写,分布式架构。详细特性如下:拥有Web脚本编辑...详情>>
2023-11-11 17:49:48
python RSA加密算法过程
1,随机选取两个质数p和q2,计算n=pq3,选取一个与Ø(n)互质的小奇数e,Ø(n)=(p-1)(q-1)4,对模Ø(n),计算e的乘法逆元d,即满足(e*d)modØ(n)...详情>>
2023-11-11 17:20:50