本文共 2954 字,大约阅读时间需要 9 分钟。
试想一下,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函数返回的是一个filter对象,我们可以通过类型转换使其更加友好的显示。
print(result)
# 输出:
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)
# 输出:
和filter类似,map函数返回的是一个map对象。同样可通过类型转换使其更加友好的显示,当然,同样的也无法转换成dict字典对象。
print(result)
# 输出:
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的类型为:
# 2的类型为:
# 3的类型为:
# 4的类型为:
同样的,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。
转载地址:http://soxys.baihongyu.com/