# 偏函数 创建一个新的函数,指定我们要使用的函数的某个参数为固定的值,这个新函数就是偏函数
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)))