python:map、filter、reduce函数使用
1 前言
Python的map、filter、reduce函数使用说明。
高阶函数概念:
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
实质上,函数map,filter和reduce均为高阶函数,它们的输入参数为函数和可迭代对象(list,tumple等),具体形式如下:
map(func, list_data)
filter(func, list_data)
reduce(func, list_data)
2 使用
2.1 map:
map(function,seq[,seq2]) 接收两个参数,第一个是function,第二个是序列:(使用上类似java的jdk8的Stream API的map方法进行值的映射,java的Stream API还有一个flatMap方法,可以扁平式一对多拆分映射)
使用如下,对list中每个值进行平方计算:
nums = [1, 2, 3]
new_nums = list(map(lambda x: x ** 2, nums))
print(new_nums)
# [1, 4, 9]
2.2 filter:
filter(function, seq)接收两个参数,基本作用是对可迭代对象中的元素进行过滤;并返回一个新的可迭代filter对象(使用上类似java的jdk8的Stream API的filter方法,筛选值,返回true的保留,返回false的对应值过滤):
使用如下,保留list中值的平方结果,不为自身的值:
nums = [1, 2, 3]
new_nums = list(filter(lambda x: x ** 2 != x, nums))
print(new_nums)
# [2, 3]
2.3 :reduce
reduce(function,seq[,initial])接收三个参数,基本作用为对序列进行累积;并返回结果。python3中reduce需从functools模块导入。
下面都是对于nums求和的实现,使用sum方法和reduce均可,但是reduce更灵活:
nums = [1, 2, 3]
print(sum(nums))
# 6
from functools import reduce
print(reduce(lambda x, y: x + y, nums))
# 6
reduce还可以做累乘等其它操作,更加灵活,例如如下的操作:
from functools import reduce
def run():
print("run:", "xiaoxu")
return "run"
def walk():
print("walk:", "xiaoxu")
return "walk"
def drink():
print("drink:", "xiaoxu")
return "drink"
def empty():
print("empty")
nums = [empty, run, walk, drink]
print(reduce(lambda x, y: y(), nums))
# run: xiaoxu
# walk: xiaoxu
# drink: xiaoxu
# drink
上述可知,最终结果以最后的函数返回结果为准。
另外针对上面reduce的用法还可以有变形,如涉及到函数嵌套调用的场景(上一个方法的结果会被下一个方法参数接收并使用):
from functools import reduce
# lambda方法传入可选参数*x,这样reduce调用时不用必传参数,否则下面的y(x())写法中,x()是不需要参数的,没有可选参数将会抛出异常
def run(arg):
print("run:", arg)
return lambda *x: "run"
def walk(arg):
print("walk:", arg)
return lambda *x: "walk"
def drink(arg):
print("drink:", arg)
return lambda *x: "drink"
def empty():
print("empty")
return "xiaoxu"
nums = [empty, run, walk, drink]
print(reduce(lambda x, y: y(x()), nums))
# empty
# run: xiaoxu
# walk: run
# drink: walk
# <function drink.<locals>.<lambda> at 0x000001B5C4264550>
# 上面的y(x())理解为:run(empty())、walk(run())、drink(walk())的依次调用
# 最后print输出drink(walk())的返回值,也就是lambda函数:lambda *x: "drink"
print(reduce(lambda x, y: y(x()), nums)())
# empty
# run: xiaoxu
# walk: run
# drink: walk
# drink