Python 高阶映射和过滤函数,Python的两个内置高阶函数map()
和filter()
基本上可以处理任何数据。总的说来,优化这两个函数以获得更高性能比较困难。后面会介绍Python 3.4的几个函数,包括imap()
、ifilter()
和ifilterfalse()
等。
表达映射关系有3种方式,假设有函数f(x)
,集合对象C
,可以用下面3种方式表达映射关系:
map()
函数:map(f, C)
- 生成器表达式:
(f(x) for x in C)
- 包含
yield
语句的生成器函数:
def mymap(f, C):
for x in C:
yield f(x)
mymap(f, C)
类似地,可以用下面3种方法把filter()
函数应用于集合。
filter()
函数:filter(f, C)
。- 生成器表达式:
(x for x in C if f(x))
。 - 包含
yield
语句的生成器函数:
def myfilter(f, C):
for x in C:
if f(x):
yield x
myfilter(f, C)
不同方式的性能存在一定差异,其中map()
和filter()
最快。更重要的是,可以用不同的方式扩展上面的映射和过滤,如下所示。
- 可以创建一个更复杂的函数
g(x)
应用于每个元素,或者在处理前先对集合应用一个函数。这些方法对上面三种设计模式都适用,也是函数式设计擅长的领域。 - 修改生成器表达式或者生成器函数中的
for
循环。比较常用的处理方法是为生成器表达式添加if
从句,从而将映射和过滤合并到一次操作中。还可以合并mymap()
函数和myfilter()
函数,从而实现合并映射操作和过滤操作。
在软件不断完善和成熟的过程中,常通过修改循环体来调整数据结构。对此有多种设计模式,包括打包、拆包(或者展开)、平铺以及结构化,之前介绍过其中几种。
设计映射时,如果一个函数中包含太多转换,就要注意了。应尽量避免创建那些主要功能不明的函数。由于Python没有优化编译器,有时必须通过合并函数来手动优化一些低性能的应用。但只在别无他法时才可以使用这类优化,也就是说,只有在性能分析表明应用需要优化时,才进行优化。