Python高阶函数filter、map、reduce的使用

试想一下,Python是一门怎样的语言?

没错,简单、优雅、易懂是它最明显的特征。笔者刚接触Python时,便开始惊叹这门语言强大的类库支撑,这种面向调用的编程方式属实真香,虽然性能有点可惜(尺有所短,寸有所长),但笔者对Python依旧爱的深沉。

Python中有着许多好用的内建函数供开发者使用,其中有这么个函数三兄弟filter、map、reduce被称作高阶函数,由于他们的使用方法比较类似,所以联合记忆起来也比较容易。

filter

filter主要用来过滤序列,可以理解为一个过滤器。

filter(function or None, iterable)

# function:判断函数
# iterable:可迭代对象

function参数用于对iterable进行过滤,将function返回值为False的元素过滤,剩下为True的元素将组成一个filter对象被返回(Python 2.x 返回的是列表)。

# 定义函数func
def func(x):
    # x大于5时返回True,否则返回False
    return x > 5


num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]

result = filter(func, num_list)

print(result)

# 输出:<filter object at 0x000001F8763751C8>

通过上述代码可看到,filter函数返回的是一个filter对象,我们可以通过类型转换使其更加友好的显示。

print(result)
# 输出:<filter object at 0x000001703525F1C8>

print(list(result))
# 转换为列表对象,输出:[6, 7, 8, 9]

print(tuple(result))
# 转换为元组对象,输出:(6, 7, 8, 9)

print(set(result))
# 转换为集合对象,输出:{8, 9, 6, 7}

需要注意的是,filter对象无法转换成字典dict,对于字典的过滤,我们需要些特殊处理,即提取value进行过滤。

def func(x):
    # x为偶数时返回True,否则返回False
    return x % 2 == 0


num_list = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

result = filter(func, num_list.values())

print(list(result))

filter可以结合匿名函数lambda使用。

num_list = [1, 2, 3, 4, 5]

# 筛选出大于2的数字
result = filter(lambda x: x > 2, num_list)
print(list(result))

# 输出:[3, 4, 5]

map

map函数会根据提供的函数对指定序列做映射。

map(function, iterable, ...)

# function:判断函数
# iterable:可迭代对象

map也是接受一个函数参数与一个迭代参数,通过函数参数对序列进行映射。

def func(x):
    # 返回x的x次方
    return x ** x


num_list = [1,2,3,4,5]

result = map(func, num_list)

print(result)
# 输出:<map object at 0x000001CEA3AB9708>

和filter类似,map函数返回的是一个map对象。同样可通过类型转换使其更加友好的显示,当然,同样的也无法转换成dict字典对象。

print(result)
# 输出:<map object at 0x000001CEA3AB9708>

print(list(result))
# 转换为列表对象,输出:[1, 4, 27, 256, 3125]

print(tuple(result))
# 转换为元组对象,输出:(1, 4, 27, 256, 3125)

print(set(result))
# 转换为集合对象,输出:{256, 1, 4, 3125, 27}

map函数还可以并行使用,非常的自由。

def func(x, y, z):
    return x * 100 + y * 10 + z


num_list1 = [1, 4, 7]
num_list2 = [2, 5, 8]
num_list3 = [3, 6, 9]

result = map(func, num_list1, num_list2, num_list3)

print(list(result))
# 输出:[123, 456, 789]

map还可以用来做类型转换。

result = map(int, '1234')

for i in result:
    print(f'{i}的类型为:{type(i)}')

# 输出:
#   1的类型为:<class 'int'>
#   2的类型为:<class 'int'>
#   3的类型为:<class 'int'>
#   4的类型为:<class 'int'>

同样的,map也可以与lambda函数结合使用。

num_list = [1, 2, 3, 4, 5]

# lambda返回x的平方
result = map(lambda x: x ** 2, num_list)
print(list(result))

# 输出:[1, 4, 9, 16, 25]

reduce

reduce函数会对参数序列中元素进行累积,首先看一下reduce的语法。

from functools import reduce

reduce(function, iterable[, initializer])

# function:函数参数
# iterable:可迭代对象
# initializer:可选,初始参数

function为函数参数,iterable依旧是可迭代对象,initializer为可选的初始参数。

在python3.x中,reduce移到了functools模块中,使用时需要先引入。

from functools import reduce

num_list = [1, 2, 3, 4, 5]

result = result = reduce(lambda x, y: x * 10 + y, num_list)

print(result)
# 输出:12345

通过上述案例可发现,reduce是通过可迭代对象的前两个元素传递给函数参数进行函数加工。

然而,有初始化值的情况下,这个时候就不是取迭代对象的前两项,而是取初始参数initializer和第一个元素。

from functools import reduce

num_list=[1, 2, 3, 4]

# 初始参数initializer,即 从5开始累加
result = reduce(lambda x, y: x + y, num_list, 5)

print(result)
# 输出:15
# 即: 5 + 1 + 2 + 3 + 4 = 15

以上便是这仨兄弟函数的技术总结,值得一提的是,自1994年Python 1.0 解释器发布起,Python便存在这三个高阶函数,以及匿名函数lambda。虽然,如今的2.x及3.x在这三个函数上有些不同的语法,但无伤大雅。

Python依然是那个Python。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。