python函数式编程(map reduce filter sorted)

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)]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341