python技巧

python函数式编程(map reduce filter so

2018-08-30  本文已影响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一样都是传一个函数和一个可迭代对象
但不同的是:

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)]
上一篇 下一篇

猜你喜欢

热点阅读