Python学习打call第二十天:高阶函数

今天主要学习了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同学计划

    原文作者:暖A暖
    原文地址: https://www.jianshu.com/p/979036d445c4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞