【Python基础】内置函数-map+filter+reduce+lambda
Python内置函数目录
- max()/min()
- sorted()
- map()
- filter()
- reduce()
- lambda()
max()
"""max() min() max(iterable, *[, default=obj, key=func]) -> value max(arg1, arg2, *args, *[, key=func]) -> value #max() 处理的是可迭代对象,相当于for循环出每一个元素进行比较。#注意:python3不同数据类型 不能直接比较 每个元素进行比较,是从每个元素的第一个位置依次比较,如果这一个位置分出大小,后面的不需要在比较了,直接得出这两个元素大小 """ """一般简单的用法""" # vals = [11,56,32,145] # vals = [11,56,32,"xiong"] #Python3中报错,Python2中可以比较 max(98,'a') 9<97 比较第一个位置 # print(max(vals)) """问题描述:找出字典中年龄最大的一项 输入名称和年龄""" # myage = {"xiong_age":26,"wang_age":22,"zhang_age":33,"ling_age":25} # print(max(myage.values())) #只比较了valuse 那个最大,但不知道具体是那个key对应的 # new_myage = zip(myage.values(),myage.keys()) #将myage变为 {年龄:姓名} 的字典 # ret = max(new_myage) # print(ret) """ 另一种max() 方法,传入key = """ people = [ {"name":"zhang","age":18}, {"name":"wang","age":28}, {"name":"ling","age":15}, {"name":"xiong","age":26}, {"name":"zhao","age":56}, {"name":"sun","age":35}, ] # ret = max(people,key=lambda dic:dic["age"]) # # """max(iterable,key=lambda dic:dic["age"]) 对可迭代对象for循环 经过lambda函数处理 对每一项的 age比较大小""" # print(ret) # print(pow(2,3)) #相当于 2**3 =8 # print(pow(2,3,3)) #相当于 2**3%3 =2 比自己写的 幂运算表达式效率要高
sorted()
"""sorted() 排序""" l=[3,2,1,5,7] l1=[3,2,'a',1,5,7] print(sorted(l)) # print(sorted(l1)) #排序本质就是在比较大小,不同类型之间不可以比较大小 people=[ {'name':'alex','age':1000}, {'name':'wupei','age':10000}, {'name':'yuanhao','age':9000}, {'name':'linhaifeng','age':18}, ] print(sorted(people,key=lambda dic:dic['age'])) name_dic={ 'abyuanhao': 11900, 'alex':1200, 'wupei':300, } print(sorted(name_dic)) #对字典的keys 进行排序 # print(sorted(name_dic,key=lambda key:name_dic[key])) #对字典的dict[keys] 进行排序 # print(sorted(zip(name_dic.values(),name_dic.keys())))
map()
num_l=[1,2,10,5,3,7] res=map(lambda x:x+1,num_l) ##res 得到的是 <map object at 0x000002A365360240> map()处理得到的是一个迭代器,只能使用一次 # # for i in res: # # print(i) print(list(res))
map()用法总结:
""" 总结: ret = map([函数],[可迭代对象]) #返回的ret是一个map对象,用list(ret) 取出结果 # 函数可以是def 自定义的,也可以是lambda,可迭代对象(字符串、列表、元组、字典) """
map()内部原理
num_l=[1,2,10,5,3,7] num1_l=[1,2,10,5,3,7] # ret=[] # for i in num_l: # ret.append(i**2) # # print(ret) # # def map_test(array): # ret=[] # for i in array: # ret.append(i**2) # return ret # # ret=map_test(num_l) # rett=map_test(num1_l) # print(ret) # print(rett) # num_l=[1,2,10,5,3,7] # lambda x:x+1 def add_one(x): return x+1 # # #lambda x:x-1 def reduce_one(x): return x-1 # # #lambda x:x**2 def pf(x): return x**2 # # def map_test(func,array): # ret=[] # for i in num_l: # res=func(i) #add_one(i) # ret.append(res) # return ret # print(map_test(add_one,num_l)) # print(map_test(lambda x:x+1,num_l)) # print(map_test(reduce_one,num_l)) # print(map_test(lambda x:x-1,num_l)) # print(map_test(pf,num_l)) # print(map_test(lambda x:x**2,num_l)) """终极版本""" num_l=[1,2,10,5,3,7] def map_test(func,array): #func=lambda x:x+1 arrary=[1,2,10,5,3,7] ret=[] for i in array: res=func(i) #add_one(i) ret.append(res) return ret print(map_test(lambda x:x+1,num_l)) res=map(lambda x:x+1,num_l) print('内置函数map,处理结果',res) #<map object at 0x000002A365360240> map()处理得到的是一个迭代器,只能使用一次 # # for i in res: # # print(i) print(list(res)) print('传的是有名的函数',list(map(reduce_one,num_l))) # # msg='linhaifeng' print(list(map(lambda x:x.upper(),msg))) """ 总结: ret = map([函数],[可迭代对象]) #返回的ret是一个map对象,用list(ret) 取出结果 # 函数可以是def 自定义的,也可以是lambda,可迭代对象(字符串、列表、元组、字典) """
filter()
用法:
movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb'] res = filter(lambda n:not n.endswith('sb'),movie_people) #res 得到一个迭代器对象 print(res) #<filter object at 0x00000164321BCDA0> print(list(res)) ## 使用 list(res) 调用列表地址里的东西
用法举例:
'''使用案例''' #过滤出1~100中平方根是整数的数: # import math # def is_sqr(x): # return math.sqrt(x) % 1 == 0 # # newlist = filter(is_sqr, range(1, 101)) # print(list(newlist))
filter()用法总结
""" 总结: filter(function or None, iterable) --> filter object #function 可以是def 自定义的函数名,也可以是lambda,符合过滤条件返回True 否则返回False , iterable 是可迭代对象,过滤掉可迭代对象每一项经过函数处理后的对象 返回一个列表地址,要用 list() 取出地址中的内容 """
filter()原理:
'''版本1''' # movie_people=['sb_alex','sb_wupeiqi','linhaifeng','sb_yuanhao'] # def filter_test(array): # ret=[] # for p in array: # if not p.startswith('sb'): # ret.append(p) # return ret # # res=filter_test(movie_people) # print(res) '''版本2''' # movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb'] # def sb_show(n): # return n.endswith('sb') #1/0 # # def filter_test(func,array): # ret=[] # for p in array: # if not func(p): # ret.append(p) # return ret # # res=filter_test(sb_show,movie_people) # print(res) #终极版本 # movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb'] # def sb_show(n): # return n.endswith('sb') # #等价于--->lambda n:n.endswith('sb') # # def filter_test(func,array): # ret=[] # for p in array: # if not func(p): # ret.append(p) # return ret # # res=filter_test(lambda n:n.endswith('sb'),movie_people) # print(res) # # #最终得出 filter()函数 movie_people=['alex_sb','wupeiqi_sb','linhaifeng','yuanhao_sb'] res = filter(lambda n:not n.endswith('sb'),movie_people) #res 得到一个迭代器对象 print(res) #<filter object at 0x00000164321BCDA0> print(list(res)) ## 使用 list(res) 调用列表地址里的东西 # # print(list(filter(lambda n:not n.endswith('sb'),movie_people))) #直接打印出来 没赋值给变量保存下来,即在内存中开辟一块地方存下来了 但没有记录门牌号 打印之后就自动清除了 """ 总结: filter(function or None, iterable) --> filter object #function 可以是def 自定义的函数名,也可以是lambda,符合过滤条件返回True 否则返回False , iterable 是可迭代对象,过滤掉可迭代对象每一项经过函数处理后的对象 返回一个列表地址,要用 list() 取出地址中的内容 """ '''使用案例''' #过滤出1~100中平方根是整数的数: # import math # def is_sqr(x): # return math.sqrt(x) % 1 == 0 # # newlist = filter(is_sqr, range(1, 101)) # print(list(newlist))
reduce()
用法:
"""最后 引出 reduce函数""" from functools import reduce def add_num(x,y): return x+y num_l=[1,2,3,100] print(reduce(lambda x,y:x+y,num_l,3)) print(reduce(add_num,num_l))
总结:
""" 总结: reduce() 就是对iterable 每一项经过function处理后累计输出一个结果,有初始值从初始值开始 没有就从iterable第一项开始 reduce(function, iterable, initial=None) #function 定义函数,iterable -- 可迭代对象 ,initial 初始值 默认为None ## reduce_test(func,array,init=None) """
原理:
# from functools import reduce """ 版本1:""" # num_l=[1,2,3,100] # # res=0 # for num in num_l: # res+=num # # print(res) # # num_l=[1,2,3,100] # def reduce_test(array): # res=0 # for num in array: # res+=num # return res # # print(reduce_test(num_l)) """版本2""" # num_l=[1,2,3,100] # # def multi(x,y): # return x*y # # lambda x,y:x*y # # def reduce_test(func,array): # res=1 # for num in array: # res=func(res,num) # return res # # print(reduce_test(multi,num_l)) # print(reduce_test(lambda x,y:x*y,num_l)) """ 终极版本 -指定一个初始值""" # num_l=[1,2,3,100] # def reduce_test(func,array,init=None): # if init is None: # res=array.pop(0) # else: # res=init # for num in array: # res=func(res,num) # return res # # print(reduce_test(lambda x,y:x*y,num_l,2)) """最后 引出 reduce函数""" from functools import reduce def add_num(x,y): return x+y num_l=[1,2,3,100] print(reduce(lambda x,y:x+y,num_l,3)) print(reduce(add_num,num_l)) """ 总结: reduce() 就是对iterable 每一项经过function处理后累计输出一个结果,有初始值从初始值开始 没有就从iterable第一项开始 reduce(function, iterable, initial=None) #function 定义函数,iterable -- 可迭代对象 ,initial 初始值 默认为None ## reduce_test(func,array,init=None) """
lambda()
"""语法: lambda [形参]:[返回值] 注意:# lambda 匿名函数如果不赋值给变量,Python运行之后内存立即清空,若赋值给变量则与普通函数相同 """ # yy = lambda x:x**2 # print(yy(2)) # ff1 = lambda s:str(s)+"_sb" # print(ff1("alex")) """一般情况下 lambda 直接使用,不赋值给变量。与其他函数混合使用"""