资讯专栏INFORMATION COLUMN

Python3的高阶函数map,reduce,filter

Codeing_ls / 3299人阅读

摘要:函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。和不同的是,把传入的函数依次作用于每个元素,然后根据返回值是还是决定保留还是丢弃该元素。

函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
注意其中:map和filter返回一个惰性序列,可迭代对象,需要转化为list

>>> a = 3.1415
>>> round(a,2)
3.14
>>> a_round = round
>>> a_round(a,2)
3.14
>>> def func_devide(x, y, f):
    return f(x) - f(y)
#传递参数为函数
print(func_devide(9.3, 3.2, round))
1. map函数

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

>>> print(list(map(str, [1, 2, 3])))
["1", "2", "3"]
>>> dt = map(str,[-1,2,3,4,5,-34,-45,-23.454])
>>> dt

>>> list(dt)
["-1", "2", "3", "4", "5", "-34", "-45", "-23.454"]
>>> dt = map(abs,[-1,2,3,4,5,-34,-45,-23.454])
>>> list(dt)
[1, 2, 3, 4, 5, 34, 45, 23.454]

注意报错:TypeError: "map" object is not callable
一般出现的原因是迭代对象(str,abs等)或者函数(map)被修改,不再是原来的函数,导致出现不可迭代对象

2. reduce函数

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。返回的是一个计算的最终结果,函数接收两个参数:

 def add(x,y):
...     return x + y
... 
>>> reduce(add,[1,2,3,4,5,6,7,8,9,10])
55
>>> def concate(x,y):
...     return str(x)+str(y)
... 
>>> reduce(concate,[1,2,3,4,5,6,7,8,9,0])
"1234567890"

reduce和map函数结合做字符串转整型(或者整型转字符串)

>>> str = "12121212132323"
>>> dic_str_int = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}
>>> def str_arr(x):
...     dic_str_int = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}
...     return dic_str_int[x]
... 
>>> def int_dum(x,y):
...     return 10*x + y
... 
>>> reduce(int_dum,map(str_arr,str))
12121212132323

示例,转换列表内数据为大写,首字母大写

>>> names = ["jack","john","wilianmon","jobs","bill","gates"]
>>> def str_upper(string):
...     return string.upper()
... 
>>> names = map(str_upper,names)
>>> list(names)
["JACK", "JOHN", "WILIANMON", "JOBS", "BILL", "GATES"]
>>> def str_capitialize(string):
...     return string.capitalize()
... 
>>> names = ["jack","john","wilianmon","jobs","bill","gates"]
>>> 
>>> names = map(str_capitialize,names)
>>> list(names)
["Jack", "John", "Wilianmon", "Jobs", "Bill", "Gates"]

列表内参数求所有元素乘积:

int_li = [2,3,5,10]
>>> reduce(lambda x, y: x*y,int_li)
300
>>> def func_mult(li=None):
...     return reduce(lambda x, y: x*y,li)
... 
>>> func_mult(int_li)
300

上面的可以根据需要转成函数,更方便调用

"123.456"转成整数123.456

方法一:截断之后拼接

def string_int(strs):
    str_li = strs.split(".")
    def str_int(str):
        dic_str_int = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}
        return dic_str_int[str]
    int_1 = reduce(lambda x, y: x*10+y, list( map(str_int,str_li[0])))
    int_2 = reduce(lambda x,y: x*10 + y,list(map(str_int,str_li[1])))
    return int_1 + int_2/(10**(len(str_li)+1))

res = string_int("123.456")
print(res)
#结果:123.456

方法二: 转成纯数字字符串

def string_int1(strs):
    # 记住位置,替换
    point_len = len(strs) - strs.find(".")-1
    str_li = strs.replace(".", "")
    def str_int(str):
        dic_str_int = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}
        return dic_str_int[str]
    int_num = reduce(lambda x,y: x*10 + y,list(map(str_int,str_li)))
    return int_num/(10**(point_len))

res = string_int1("123.456")
print(res)
#结果:123.456
3. filter函数

filter()也接收一个函数和一个序列。从一个序列中筛出符合条件的元素。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
注意:和map函数的区别

函数名 区别
map 作用于每个可迭代对象的元素,并返回处理之后的元素
filter 作用于可迭代内每个元素,根据计算后结果:True保留,Flase去掉

eg: 获取列表内所有的整数类型元素

def only_int(x):
    try:
        if isinstance(x, int):
            return True
        else:
            return False
    except ValueError as e:
        return False

dt = filter(type_int,[1,2,3,3,"3232",-34.5,34.5])
>>> list(dt)
[1, 2, 3, 3]

。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45208.html

相关文章

  • python_bomb----高阶函数

    摘要:高阶函数实参是一个函数名函数的返回值是一个函数传递的参数包含函数名。内置高阶函数函数函数接收两个参数一个是函数一个是序列将传入的函数依次作用到序列的每个元素并把结果作为新的返回。 高阶函数 实参是一个函数名 函数的返回值是一个函数 print(abs(-10)) f = abs print(f(-10)) #传递的参数包含函数名。 def myfun(x,y,fun): ...

    Pocher 评论0 收藏0
  • python高阶函数使用方法实例

      本文关键给大家介绍了python高阶函数使用方法实例详细说明,感兴趣的小伙伴可以参考借鉴一下,希望可以有一定的帮助,祝愿大家多多的发展,尽早涨薪  一、高阶函数  函数定义  python中,函数名是自变量,下边这一method函数名当做自变量,偏向1个计算出来的函数公式!因而函数名本身就是偏向函数的自变量,故自变量可偏向函数公式;  自变量可偏向函数公式,且函数的自变量可以接受自变量,那样任...

    89542767 评论0 收藏0
  • 【译】高阶函数:利用FilterMapReduce来编写更易维护代码

    摘要:原文作者译者高阶函数可以帮助你增强你的,让你的代码更具有声明性。知道什么时候和怎样使用高阶函数是至关重要的。太棒了我们通过使用高阶函数减少了许多额外的代码。 原文:Higher Order Functions: Using Filter, Map and Reduce for More Maintainable Code作者:Guido Schmitz译者:JeLewine 高阶函数可...

    jone5679 评论0 收藏0
  • map, reduce, filter高阶函数

    摘要:换个新话题内容高阶函数至少满足以下条件函数可以作为参数被传递函数可以作为返回值被输出。区别返回值是,不可以链式调用返回一个新数组,原数组不会改变结语业精于勤而荒于嬉,行成于思而毁于随。 初衷 上篇其实还有一篇关于闭包的文章,由于在前几篇中已经涉及到了相关方面,因此闭包文章暂时搁置一下。换个新话题: 内容 高阶函数:Higher-order function; 至少满足以下条件: 函...

    JaysonWang 评论0 收藏0
  • Python一等函数简析

    摘要:本文重点了解函数在中是一等对象了解中的可调用对象掌握正确定义函数参数的方法了解和中支持函数式编程的方法。归约函数定义能够接受一个可迭代对象并返回单个结果的函数是归约函数。 导语:本文章记录了本人在学习Python基础之函数篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、了解函数在Python中是一等对象;2、了解Python中的可调用对象;3...

    shusen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<