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)]
 
posted @ 2020-05-31 13:12  闹点小情绪q  阅读(207)  评论(0编辑  收藏  举报