今天主要学习了Python中sorted,filter, map 三个高阶函数,还了解了一下函数的柯里化;
1.什么是高阶函数
- 在数学中高阶函数又称算子(运算符)或泛函,包含多于一个箭头的函数,语法为:y = f(g(x));
- 在python中,一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数;
def way1(x):
return x + 3
def way2(x):
return x * x
result = way2(way1(7))
print(result) # 100
2.标准库中的高阶函数
sorted函数:
# 反向排序
str = sorted('abcdefg', reverse=True)
print(str) # ['g', 'f', 'e', 'd', 'c', 'b', 'a']
# 按指定元素进行排序
obj = [[1,2], [5,6], [2,8], [8,3], [3,10]]
func = lambda x: x[1]
new_list = sorted(obj, key=func, reverse=False)
print(new_list) # [[1, 2], [8, 3], [5, 6], [2, 8], [3, 10]]
sorted是Python提供的功能强大的排序函数,满足字符、数字等排序要求;
函数的第一个参数为可迭代对象,第二个参数key作为排序的规则(指定按什么排序),第三个参数表明是否反向;
sorted函数的返回结果是列表类型;
filter函数:
# 过滤
obj = filter(lambda x: x > 0, [-20, -10, -1, 0, 1, 10, 20])
print(obj) # <filter object at 0x004C9EB0>
for i in obj:
print(i) # 1 10 20
filter函数也是接收一个函数和一个序列的高阶函数,其主要功能是过滤;
第一个参数是一个函数,第二个参数是可迭代对象;
filter函数的返回值是迭代器对象filter;
map函数:
# 函数映射
obj = map(lambda x: x+1, [0,6,10])
print(obj) # <map object at 0x0026DDB0>
for i in obj:
print(i) # 1 7 11
#封包传递
obj2 = map(lambda x, y: x+y, *([0, 5, 8], [2, 2, 2]))
print(obj2) # <map object at 0x0076FE90>
for i in obj2:
print(i) # 2 7 10
map函数用来将序列中的值处理再依次返回至列表内;
第一个参数func为函数,实现函数映射的功能,第二个参数为可迭代对象;
map函数的返回值为一个迭代器对象map;
3.自实现高阶函数
# sorted高阶函数自实现
def my_sorted(iterable, key=lambda a,b: a<b, reverse=False):
ret = []
for x in iterable:
for i, y in enumerate(ret):
isReverse = reverse
if key(x,y) if not isReverse else key(y,x):
ret.insert(i, x)
break
else:
ret.append(x)
return ret
print(my_sorted([3,21,3,4,5], reverse=False))
4.函数的柯里化
- 柯里化是将一个多参的函数转换成多个单参的函数,也就是将一个 n 元函数转换成 n 个一元函数;
将f(x, y) 转换为 f(x)(y)
f(x, y) = f(x)(y)
- 也就相当于把一个函数做成嵌套函数,外层函数的返回值是内层函数,这样,外层函数调用完,返回的是一个内层函数,能接着调用;
# 普通函数
def add(x, y):
return x + y
print(add(3,7)) # 10
# 柯里化
def new_add(x):
def _add(y):
return x + y
return _add
print(new_add(3)(7)) # 10
参考:侠课岛(9xkd.com)Python同学计划