匿名函数、高阶函数、map函数、filter函数、reduce函数

1.匿名函数

    例如: lambda x: x+1

    此为匿名函数 x为形参,x+1为函数表达式 (此处表达式逻辑不能过于复杂,条件语句等不能使用;可以定义多个形参 如 lambda x,y,z:x+y+z;

    匿名函数也可返回多个值,但需要加括号  如 lambda  x,y,z: (x+1,y+1,z+1)

  (1)匿名函数的调用

func = lambda x:x+1    赋名

a=func(10)        调用
print(a)         打印
运行结果:
11

  

2.高阶函数 : 函数接受的参数是一个函数名  或者   返回值中包含函数

def bar():
    print('from bar')
    
def foo():          foo() 为高阶函数
    print('from foo')
    return bar()      此处运行bar() 并得到其返回值,并返回

print(foo())
运行结果:

from foo
from bar

None              因为bar()没有返回值,所以此处为None

 3.map函数  map(x,y) 两个形参,第一个为处理方法,第二个为一个可迭代对象。map函数将可迭代对象中的每一个值运for循环遍历,并把每个值交给前边形参所提供的处理方法进行处理并返回值

           最终得到的是与原来相似的处理后的对象(元素个数及位置与原来的一样)   

num_l = [1,2,10,5,3,7]
def map_test(func,array):
    ret=[]
    for i in array:
        res=func(i)
        ret.append(res)
    return ret

print(map_test(lambda x:x+1,num_l))                传入一个匿名函数(也可以自己再定义一个函数),传入一个处理对象
print('内置函数map,处理结果:',map(lambda x:x+1,num_l))
运行结果:

[2, 3, 11, 6, 4, 8]
内置函数map,处理结果: <map object at 0x00000272B81276D8>    有此处可以得知,map函数与map_test()作用一样,但写起来更为简便,但其得到的结果为一个内存地址(可迭代对象),可通过

                                     print(list(map(lambda x:x+1,num_l))) 来得到与 map_test() 相同过的效果

4.filter函数 filter(x,y) 第一个形参为函数,第二个形参为可迭代对象,filter函数将第二个形参中的值遍历给第一个形参传入的函数处理,函数返回布尔值 True 或者False,并保留True的值

movie_people = ['alex_sb','qupeiqi_sb','linhaifeng','yuanhao_sb']
def filter_test(func,array):
    tet=[]
    for i in array:
        if not func(i):
            tet.append(i)
    return tet

print(filter_test(lambda n :n.endswith('sb'),movie_people))
print(filter(lambda n:not n.endswith('sb'),movie_people))
print(list(filter(lambda n:not n.endswith('sb'),movie_people)))
运行结果:

['linhaifeng'] 

<filter object at 0x00000283CFE07828>                          可知,filter()函数和自定义的filter_test()函数作用相同,其返回值也是内存地址。

['linhaifeng']                                       

5.reduce函数    reduce(x,y,z=None) 第一个形参传入函数,第二个形参传入处理的对象,第三个默认为None。将第二个形参中的值遍历传入函数进处理(累加或累乘等等),同时可加入第三个值

        即z 一并计算,最终得到的是一个值

from functools import reduce           从模块中引入reduce
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,100))
print(reduce(lambda x,y:x*y,num_l,100))
运行结果:

60000
60000                          可知 reduce函数与自定义的reduce_test()函数作用相同,返回的是一个值

原文地址:https://www.cnblogs.com/jgua/p/13504278.html