python:map、filter、reduce函数使用

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
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值