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


# 偏函数 创建一个新的函数,指定我们要使用的函数的某个参数为固定的值,这个新函数就是偏函数
def test(a, b, c, d=1):
    print(a + b + c + d)


from functools import partial  # 使用偏函数必须导入此模块

newFunc = partial(test, c=5)  # newFunc为偏函数,它设定了test函数中c的值固定为5

newFunc(1, 2)  # 9  相当于 test(1,2,5,1)

newFunc2 = partial(test, 5, 6)  # newFunc2为偏函数,它设定了test函数中第一个参数的值固定为5

newFunc2(10, 2)  # 23 相当于 test(5,6,10,2)

# 匿名函数 使用lambda关键字,通常与其它函数配合使用
# 返回单个值
print((lambda x, y, z: x + y + z)(1, 2, 3))
# 返回多个值
print((lambda x, y, z: (x + y + z, x + 1, y + 1, z + 1))(1, 2, 3))


# 高阶函数(以下两个特性满足一个即为高阶函数)
# 1函数的传入参数是一个函数名
# 2函数的返回值是一个函数名

# 例对列表进行加一或减一或平方,并返回结果
def add_one(x):
    return x + 1
# 相当于 lambda x:x+1

def reduce_one(x):
    return x - 1
# 相当于 lambda x:x+1


def square(x):
    return x ** 2
# 相当于 lambda x:x**2


list1 = [1, 2, 3, 4, 5]
list2 = [11, 21, 32, 43, 54]


def calc(func, list):
    res = []
    for i in list:
        r = func(i)  # 这里调用了传入的函数
        res.append(r)
    return res


print(calc(reduce_one, list1))
print(calc(lambda x: x - 1, list2))


# map函数:对可迭代对象的每个元素依次处理,返回依次处理后的结果
# 以上的calc函数的功能就是python中内置map函数的功能
# map函数的第一个参数可以是匿名函数,也可是自定义函数
# map函数的第二个参数是一个可迭代对象
result = list(map(lambda x: x - 1, list2))  # 将map执行返回的结果转为列表
print(result)

# 例 取出电影院里名字结尾有sb的观众
movie_people = ['alex_sb', 'wu_sb', 'zhang_sb', '张三']


def filter_test(func, array):
    ret = []
    for p in array:
        if func(p):
            ret.append(p)
    return ret


print(filter_test(lambda n: n.endswith('sb'), movie_people))

# filter函数:对可迭代对象的每个元素筛选处理,返回筛选后的结果
# 以上的filter_test函数就是python中内置filter函数的功能
# filter函数的第一个参数可以是匿名函数,也可是自定义函数
# filter函数的第二个参数是一个可迭代对象
result = list(filter(lambda n: n.endswith('sb'), movie_people))  # 将map执行返回的结果转为列表
print(result)

# 通过以上两个例子,在python中还有类似的一个函数reduce
# reduce函数:对可迭代对象的每个元素合并处理,返回一个值
# 使用reduce,必须from functools import reduce
# reduce函数的第一个参数可以是匿名函数,也可是自定义函数
# reduce函数的第二个参数是一个可迭代对象
# reduce函数的第三个参数是初始值,也可以不写
# 例 将列表中的所有数字相乘得到结果
from functools import reduce
num_list = [1, 2, 4, 11]
print(reduce(lambda x, y: x * y, num_list, 1))

# 例 计算1-100的和
print(reduce(lambda x, y: x + y, range(1,101)))
原文地址:https://www.cnblogs.com/dangrui0725/p/9416630.html