Python进阶话题杂谈(五)推导式与Python的函数式编程
推导式是Python中的一类可以使得代码非常简洁、清晰的语法,其可通过仅一条语句完成一个可能带有多重循环以及条件判断的数据结构的创建。在Python中,常见的推导式包括列表推导式、哈希推导式、集合推导式以及生成器推导式,其中生成器推导式在《迭代器与迭代器协议》一文中另行讨论,本文中不再赘述。
1 列表推导式
列表推导式是最常见的一种推导式。其由一对方括号包裹,其中由交替且可选的for、if语句,以及写在最前面的最终表达式组成:
[i * j for i in range(5) if i % 2 for j in range(5) if j % 3]
2 哈希推导式
哈希推导式用于以推导式的语法生成一个哈希表,其由一对大括号包裹,且最终表达式为一个以冒号隔开的键值对:
{i : i * 2 for i in range(10)}
3 集合推导式
集合推导式自Python2.7开始使用。其用于以推导式的语法生成一个集合。其也由一对大括号包裹,但最终表达式中无冒号,这是其与哈希推导式在语法上唯一的区别:
{i for i in range(5)}
4 lambda、map、filter、reduce函数及其与推导式的比较
lambda、map、filter、reduce是Python提供的四个函数式编程语句,本文不对其语法做详细解释说明。实际上,列表推导式在语法上确实可以实现map与filter函数的全部功能:
map(str, range(100)) 在结果上等同于 [str(j) for j in range(100)]
在许多讲解Python的书籍中,作者均推荐使用推导式语法替换掉map、filter等函数式编程语法。但根据本人测试,map、filter等函数在时间消耗上,确实要比同等计算量下的推导式写法要少,这可能得益于这些函数的底层实现。故本人还是更加推荐函数式编程语法。只有当表达式非常复杂,使用map、filter等难以书写时,才考虑使用推导式写法。
2018年6月于苏州