美文网首页python技巧
python函数式编程(map reduce filter so

python函数式编程(map reduce filter so

作者: 陆_志东 | 来源:发表于2018-08-30 23:38 被阅读0次

    map(function,Iterable)函数

    map函数接收两个参数,第一个参数是函数,第二个是可迭代对象(列表,字典,字符串),最后返回一个可迭代对象
    运行过程:
    map函数会迭代可迭代对象,取出每一个元素去交给传递的函数去执行
    示例:

    str1 = "12345"
    def fun(x):
        return int(x)
    list1 = list(map(fun,str1))
    print(list1)
    >>[1, 2, 3, 4, 5]
    

    示例2:

    def f(x):
        return x["oid"]
    
    s1 = [{"oid":1},{"oid":2},{"oid":3},{"oid":4},{"oid":5},]
    l1 = list(map(f,s1))
    print(l1)
    >>[1, 2, 3, 4, 5]
    

    示例3:

    def to_str_list(ele):
        return str(ele)
    
    list1 = [1,2,3,4,5]
    list2 = list(map(to_str_list,list1))
    print(list2)
    

    reduce(function,Iterable)函数

    虽然和map一样都是传一个函数和一个可迭代对象
    但不同的是:

    • map每次迭代一个元素,而reduce第一次迭代两个元素,然后传给函数去执行,将执行后的结果取回,作为下次函数执行的参数之一,也就是说reduce除了第一次会迭代两个元素,以后都是迭代一个元素
    • 另外一个不同的是map返回的是一个可迭代对象,而reduce返回的却是最终执行的结果,函数返回什么类型就是什么类型
    • 第三个不同是map不需要导入,可以直接调用,而reduce需要导入from functools import reduce
      示例1:
    from functools import reduce
    def str_to_num(first,second):
        return int(first)*10 + int(second)
    
    str3 = "12345"
    num1 = reduce(str_to_num,str3)
    print(num1)
    

    示例2:配合map函数一起使用

    from functools import reduce
    
    def str_to_num(obj_str):
        map_dict = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
        def get_int(x):
            return map_dict[x]
    
        def weighting(a,b):
            return a*10 + b
    
        return reduce(weighting,map(get_int,obj_str))  # 这里不需要使用list(map(get_int,obj_str))因为map本身就是返回可迭代对象
        # 上面几个示例使用list转换是因为需要打印,list内部也是做了迭代组合
    
    str1 = "1234567890"
    print(str_to_num(str1))
    >>1234567890
    

    注意上面的示例使用到了闭包
    闭包和装饰器的区别:
    闭包是内部函数引用外部的变量做一些逻辑处理.返回的是结果
    装饰器是对函数功能的扩展,返回的是一个可执行函数的引用

    结合reduce和map实现支持转换整数和浮点数的闭包示例:

    from functools import reduce
    
    def str_to_num(obj_str):
        map_dict = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
        def get_int(x):
            return map_dict[x]
    
        def weighting(a,b):
            return a*10 + b
    
        if obj_str.find(".") != -1:
            obj_list = obj_str.split(".")
            return reduce(weighting, map(get_int, obj_list[0])) + reduce(weighting, map(get_int, obj_list[1])) / (
                        10 ** len(obj_list[1]))
        return reduce(weighting,map(get_int,obj_str))
    
    
    str1 = "12345.6789"
    print(str_to_num(str1))
    >>12345.6789
    str2 = "12345"
    print(str_to_num(str2))
    >>12345
    

    高级函数之filter(function,Iterable)函数

    filter函数和map函数类似,也是传递一个函数和一个可迭代对象
    不同的是map将值放入函数执行完之后组成一个可迭代对象
    filter是将值放入函数执行完之后让你的逻辑返回一个布尔值
    filter函数会将函数执行完后返回为True的数据保留下来组成一个可迭代对象
    所以需要明确的是filter函数不改变输入的值,只是用输入的值来做逻辑运算
    选出数组中的偶数元素示例:

    def select_even(x):
      return x%2 == 0
    
    num_list = [1,2,3,4,5]
    print(filter(select_even,num_list))
    >><filter object at 0x00000000027CC6D8>
    print(list(filter(select_even,num_list))) # 需要用list迭代转一下才可以打印出来
    >>[2, 4]
    

    示例2:

    将数组中的空字符和空格字符串删除
    
    def select_even(x):
        return x and x.strip()  # 逻辑与运算,若前面值都为True结果为最后一个元素
        # 若前面有一个是False,则为False的那个元素
    
    num_list = ["1",""," ","   ","5"]
    print(list(filter(select_even,num_list)))  # "" 0 [] {} None 都会被判定为False
    >>['1', '5']
    print(0 and 1)
    >> 0
    print(1 and 2)
    >> 2
    

    高级函数之sorted(Iterable,key=None,reverse=False)函数

    sorted函数接收一个可迭代序列,和一个key -- 排序的规则 和reverse是否翻转顺序,默认False
    sorted函数会迭代可迭代对象,将每一个元素传入规则中处理,处理的过程中会加一层映射,即原数据和处理过的数据的对应关系.sorted按照处理后的数据排序,然后根据映射将原始数据也按照这个顺序展示.
    注意:
    sorted函数不改变原始数据,生成一份新的数据返回,需要变量接收
    示例一:
    直接排序数字列表

    num_list = [3,21,1,42,2]
    print(sorted(num_list))
    >>[1, 2, 3, 21, 42]
    print(sorted(num_list,reverse=True))
    >>[42, 21, 3, 2, 1]
    print(num_list)
    >>[3, 21, 1, 42, 2]
    

    示例二:
    排序字符串,默认按照ASCII码排序

    str_list = ["A","c","B"]
    print(sorted(str_list))
    >>['A', 'B', 'c']
    print(sorted(str_list,reverse=True))
    >>['c', 'B', 'A']
    print(str_list)
    >>
    

    给字符串的排序加一个规则,即忽略大小写,让字符串同时大写或者小写

    str_list = ["A","c","B"]
    print(sorted(str_list,key=lambda x:x.lower()))   
     # sorted函数会迭代每一个元素传入到key中,而key又是一个匿名函数,所有每一个元素被传递给x变量
    >>['A', 'B', 'c']
    print(sorted(str_list,key=lambda x:x.upper()))
    >>['A', 'B', 'c']
    

    示例三:
    按照字典的key排序

    dict_dict = {"a":3,"c":1,"b":2}
    print(dict_dict.items()) # dict_items对象,不支持下标索引数据,只支持for迭代
    >>dict_items([('a', 3), ('c', 1), ('b', 2)])  
    print(sorted(dict_dict))   # 以字典的key进行排序得到排序后的key组成的列表
    >>['a', 'b', 'c']
    print(sorted(dict_dict.items()))  # 以key排序得到 元祖形式的键值对组成的列表
    >>[('a', 3), ('b', 2), ('c', 1)]
    print(sorted(dict_dict.items(),key=lambda x:x[1]))  # value排序
    >>[('c', 1), ('b', 2), ('a', 3)]
    

    相关文章

      网友评论

        本文标题:python函数式编程(map reduce filter so

        本文链接:https://www.haomeiwen.com/subject/brmziftx.html