函数式编程的本质是通过函数处理数据,过滤、映射和聚合是处理数据的三大基本操作。
这三种操作python对应的基本函数:filter(),map(),reduce()
filter()
过滤操作使用filter() 函数,它可以对可迭代对象的元素进行过滤
filter(function, iterable)
其中参数 function 是一个函数,参数iterable是可迭代对象。filter函数调用时iterable会被遍历,它的元素被逐一传入function函数,function函数返回布尔值。 在function函数中编写过滤条件,结果为True的元素被保留,False的被过滤。
users = ['Tony', 'tom', 'Ben', 'Alex']
users_filter = filter(lambda u: u.startswith('T'), users)
print(list(users_filter))
['Tony', 'Tom']
<filter object at 0x0000022873498B50>
filter() 函数还不是一个列表,是一个filter对象,需要使用list()
函数转换过滤之后的数据为列表。
num_list = range(1, 11)
num_filter = filter(lambda it: it % 2 == 0, num_list)
print(list(num_filter))
map()
映射操作使用 map() 函数,它可以对可迭代对象的元素进行变换
map(function, iterable)
其中参数 function 是一个函数,参数iterable是可迭代对象。map函数调用时iterable会被遍历,它的元素被逐一传入function函数,在function函数中对元素进行变换。
users = ['Tony', 'Tom', 'Ben', 'Alex']
users_map = map(lambda u: u.lower(), users)
print(list(users_map))
函数式编程时数据可以从一个函数 “流入" 另外一个函数,但是python不支持”链式“API.
例如下面只能先进行过滤,然后在进行映射变换。
users = ['Tony', 'Tom', 'Ben', 'Alex']
users_filter = filter(lambda u: u.startswith('T'), users)
# users_map = map(lambda u: u.lower(), users_filter)
users_map = map(lambda u: u.lower(), filter(lambda u: u.startswith('T'), users))
print(list(users_map))
reduce()
集合操作会将多个数据集合起来输出单个数据,聚合中最基础的就是归纳函数 reduce(),reduce()函数会将多个数据按照指定的算法积累叠加起来,最后输出一个数据。
reduce(function, iterable[, initializer])
其中参数 function 是一个聚合操作函数,函数有两个参数,iterable是可迭代对象,initializer是初始值。
from functools import reduce
a = range(1, 10)
# a_reduce = reduce(lambda acc, i: acc + i, a)
a_reduce = reduce(lambda acc, i: acc + i, a, 2)
print(a_reduce)
导入函数,lambda acc, i: acc + i是进行聚合的表达式,acc 是 上次累计的计算结果,i 是当前元素,2 是初始值。