Python3-匿名函数、map()、reduce()、filter()
一、匿名函数
定义:
没有函数名的函数
形式:
s = lambda [arg1 [,arg2,.....argn]]:expression
lambda简化了函数定义的书写形式,使代码更为简洁。但是使用函数的定义方式更为直观,易理解。
1 def fun(a):
2 return a+1
s相当于fun这个函数体,lambda相当于fun(),arg1,arg2...相当于fun函数里面的参数a,b...,冒号后面的expression相当于return后面的a+1
二、应用场景:
1.有些函数只是临时一用,而且它的业务逻辑也很简单时,就没必要使用def来定义,这个时候就可以用lambda
2.函数都支持函数作为参数,lambda函数就可以应用
示例:
1 list1 = [{"a":10,"b":20},{"a":13,"b":20},{"a":9,"b":20}]
2 m = max(list1,key=lambda x:x["a"])
3 print("列表的最大值:",m)
结果:列表的最大值: {'b': 20, 'a': 13}
二、map()
map(func, *iterables) --> map object
接收一个函数func()和一个可迭代对象(这里理解成list),并通过把函数func依次作用在list的每个元素上,得到一个新的list并返回
示例:
1 list1 = [1,2,3,4,5,6,7]
2 result = map(lambda x:x+10,list1)
3 print(list(result))
4
5 list1 = ["a","b","c","d","e","f"]
6 result = map(lambda x:x+x,list1)
7 print(list(result))
8
9 list1 = ["a","b","c","d","e","f"]
10 for index,i in enumerate(list1):
11 list1[index]+=i
12 print(list1)
结果:
[11, 12, 13, 14, 15, 16, 17]
['aa', 'bb', 'cc', 'dd', 'ee', 'ff']
['aa', 'bb', 'cc', 'dd', 'ee', 'ff']
注意:map()函数不改变原有的list,而是返回一个新的list
由于list包含的元素可以是任意类型,因此,map()不仅仅可以处理只包含数值的list,事实上可以处理包含任意类型的list,只要传入的函数func可以处理这种数据类型
示例:假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list
1 # 方式一
2 def func(s):
3 return s[0:1].upper()+s[1:].lower()
4
5 list1 = ["liLy","sakuRa","SeeLe"]
6 result = map(func,list1)
7 print(list(result))
8
9 # 方式二
10 list1 = ["kiaNa","SeeLe","liSa"]
11 result1 = map(lambda x:x[0:1].upper()+x[1:].lower(),list1)
12 print(list(result1)
结果: ['Lily', 'Sakura', 'Seele']
['Kiana', 'Seele', 'Lisa']
三、reduce()
在Python3中,如果使用reduce,需要先从functools模块中导入:
from functools import reduce
reduce函数会对参数序列中的元素进行累积
定义:
reduce(function, sequence [, initial] ) -> value
用法:
function参数是一个有两个参数的函数,reduce依次对sequence中取一个元素,和上次调用function的结果做参数再次调用function
第一次调用function时,如果提供initial参数,会以sequence中的而第一个元素和initial作为参数调用function,否则会以序列sequence中的前两个元素作为参数调用function
示例:
1 from functools import reduce
2
3 list1 = [1,2,3,4,5,6]
4 result = reduce(lambda x,y:x+y,list1)
5 print(result)
6
7 list1 = [1,2,3,4,5,6]
8 result = reduce(lambda x,y:x+y,list1,10)
9 print(result)
10
11 tuple1 = (1,2,3,4,5)
12 result = reduce(lambda x,y:x*y,tuple1,10)
13 print(result)
结果:21 31 1200
四、filter()
语法:
filter(function, iterable)
描述:
filter()函数用于过虑序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用list()来转换
该接受两个参数,第一个为函数,第二个为序列,序列每个元素作为参数传递给函数进行判断,然后返回True或者False,最后将返回True的元素放到新的列表中
示例:
1 list1 = [1,2,3,4,5,6]
2 result = filter(lambda x:x > 3,list1)
3 print(list(result))
结果:[4, 5, 6]
五、sorted()
语法:
sorted(iterable, key=None, reverse=False)
参数说明:
iterable -- 可迭代对象。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
描述:
sorted()函数对所有可迭代对象进行排序操作
注意sort与sorted的区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。list 的 sort 方法返回的是对已经存在的列表进行操作,
而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
示例:
1 list1 = [2,3,5,1,7,6,9]
2 result = sorted(list1)
3 print(result)
4
5 list1 = [2,3,5,1,7,6,9]
6 result = sorted(list1,reverse=True)
7 print(result)
8
9 list1 = [2,3,5,1,7,6,9]
10 result = sorted(list1,key=lambda x :x * -1)
11 print(result)
12
13 a_dict={'A':2,'B':3,'C':4,'D':1,'E':5}
14 # lambda 构造匿名函数,以元组中第二个元素作为排序依据,即x[1]
15 sorted_a_dict = sorted(a_dict.items(), key = lambda x:x[1], reverse = True)
16 print(sorted_a_dict)
结果:
[1, 2, 3, 5, 6, 7, 9]
[9, 7, 6, 5, 3, 2, 1]
[9, 7, 6, 5, 3, 2, 1]
[('E', 5), ('C', 4), ('B', 3), ('A', 2), ('D', 1)]