高阶内置函数

高阶内置函数

这一部分主要是一些 Python 中内置的高阶函数。所谓的高阶函数,就是以函数为参数的函数。

filter 函数

filter 函数用来过滤掉不符合条件的元素。filter 函数有两个参数,第一个参数为规则函数,第二个参数为可迭代对象:

lst = [1, 2, 3, 4, 5, 6, 7, 8]
def foo(x):            # 规则函数
    return x > 4       # 规则函数的返回值需要是布尔值
print(filter(foo, lst))
print(list(filter(foo, lst)))

输出的结果为:

<filter object at 0x000002B53EA8AB00>
[5, 6, 7, 8]

filter 的返回值为 filter 对象,可迭代,可以通过 list 函数转化为列表。

我们可以通过 for 循环模拟内置函数 filter:

def filter(func, iter):
    lst = []
    for i in iter:
        if func(i):
            lst.append(i)
    return lst

也可以使用匿名函数作为规则函数,这样可以让代码看起来非常简洁:

# 找到年纪大于16岁的人的信息
lst = [{'id': 1,'name': 'alex','age': 18},
        {'id': 1,'name': 'wusir','age': 17},
        {'id': 1,'name': 'taibai','age': 16},]
print(list(filter(lambda x: x['age'] > 16, lst)))    # 过滤条件

输出的结果为:

[{'id': 1, 'name': 'alex', 'age': 18}, {'id': 1, 'name': 'wusir', 'age': 17}]

map 函数

map 函数也称作映射函数,用来将可迭代对象中每个元素执行函数功能:

lst = [1, 2, 3, 4, 5, 6, 8, 9]
print(map(str, lst))
print(list(map(str, lst)))

输出的结果为:

<map object at 0x000001ABD67EA908>
['1', '2', '3', '4', '5', '6', '8', '9']

map 函数返回的是 map 对象,也可以使用 list 函数转换为列表。

map 函数可以使用更多参数的规则函数来整合多个可迭代对象:

lst1 = [1,2,3]
lst2 = [3,2,1]
lst3 = [3,2,1,5]
print(list(map(lambda x, y, z: x + y + z, lst1, lst2, lst3)))

输出的结果为:
[7, 6, 5]

如果可迭代对象长度不同,map 函数的迭代次数以最短的可迭代对象为准。

sorted 函数

sorted 函数用来将可迭代对象排序:

print(sorted("alex,mdsb"))  # 升序
print(sorted(('alex','mdsb'),reverse=True)) # 降序

dic = {1:'a',3:'c',2:'b'}
print(sorted(dic))

输出的结果为:

[',', 'a', 'b', 'd', 'e', 'l', 'm', 's', 'x']
['mdsb', 'alex']
[1, 2, 3]

不管输入的可迭代对象是什么样的数据类型,sorted 函数的返回值都是一个列表。

sorted 函数也可以使用规则函数,只是这次规则函数要通过使用关键字参数的方式引入:

lst = ['天龙八部', '西游记', '红楼梦', '三国演义']
print(sorted(lst,key=len))  # key= 排序规则(函数名)
print(sorted(lst,key=lambda x: len(x)))

lst = [{'id': 1,'name': 'alex','age': 18},
    {'id': 2,'name': 'wusir','age': 17},
    {'id': 3,'name': 'taibai','age': 16},]
print(sorted(lst,key=lambda x: x['age'],reverse=True))

输出的结果为:

['西游记', '红楼梦', '天龙八部', '三国演义']
['西游记', '红楼梦', '天龙八部', '三国演义']
[{'id': 1, 'name': 'alex', 'age': 18}, {'id': 2, 'name': 'wusir', 'age': 17}, {'id': 3, 'name': 'taibai', 'age': 16}]

列表的 .sort() 方法是在列表所在的原地进行修改,而 sorted 函数则是新建一个列表:

lst = [1, 2, 3, 4, 65, -7]
print(sorted(lst))  # 新建列表
print(lst)

lst1 = [1, 2, 3, 4, 65, -7]
print(lst1.sort())  # 新建列表
print(lst1)

输出的结果为:

[-7, 1, 2, 3, 4, 65]
[1, 2, 3, 4, 65, -7]
None
[-7, 1, 2, 3, 4, 65]

max 和 min 函数

max 和 min 函数用来选取可迭代对象中的最大值或最小值,可以指定规则函数进行更复杂的选择:

lst = [1, 2, 3, 4, 5, 6, -9, 10, -22]
print(max(lst))
print(min(lst, key=abs))
print(max(lst, key=lambda x: pow(x, 4) - pow(x, 2) + x))

输出的结果为:

10
1
-22

也可以通过这两个函数找到最大的值或者最小的值对应的键:

dic = {'a': 3, 'b': 2, 'c': 1}
print(max(dic.values()))
print(min(dic, key=lambda x: dic[x]))

输出的结果为:

3
c

reduce 函数

reduce 函数用来进行累运算。规则函数中会有两个参数,第一个参数用来存储上一次运算的结果,第二个参数传入下一个值,返回值为运算操作。

需要注意的是,在 Python 2 中,reduce 可以直接使用,而在 Python 3 中,需要在 functools 里面导入 reduce 函数:

from functools import reduce

我们可以通过 reduce 函数实现累乘运算:

from functools import reduce
def func(x, y):
    return x * y
print(reduce(func, range(1, 6)))

输出的结果为: 120

将函数用匿名函数整合会让代码更加简洁:

from functools import reduce
print(reduce(lambda x, y: x * y, range(1, 6)))

zip 函数

zip 是拉链的意思,用来将两个可迭代对象以关联起来,以返回值为 zip 对象,可以转换为列表,列表中的每个元素为原来的可迭代对象中的元素组成的元组:

lst1 = [1, 2, 3, 4, 5]
lst2 = [5, 4, 3, 2, 1]
print(zip(lst1, lst2))
print(list(zip(lst1, lst2)))

返回的结果为:

<zip object at 0x0000021A6A792B48>
[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]

使用 map 函数也可以实现类似的功能:

lst1 = [1, 2, 3, 4, 5]
lst2 = [5, 4, 3, 2, 1]
print(list(map(lambda x, y: (x, y), lst1, lst2)))

输出的结果为:

[(1, 5), (2, 4), (3, 3), (4, 2), (5, 1)]

这种数据类型可以直接使用 dict 函数转换为字典:

lst1 = [1, 2, 3, 4, 5]
lst2 = [5, 4, 3, 2, 1]
print(dict(zip(lst1, lst2)))

输出的结果为:

{1: 5, 2: 4, 3: 3, 4: 2, 5: 1}

高阶内置函数比较

函数名 规则函数位置 规则函数形参数目 返回值数据类型
filter 首位 1个 filter对象,可转换为列表
map 首位 1个或多个 map对象,可转换为列表
reduce 首位 2个 可迭代对象中的元素
max和min 末尾,用key指明 1个 可迭代对象中的元素
sorted 末尾,用key指明 1个 列表
zip zip对象,可转换为列表或字典
posted @ 2020-03-06 20:47  shuoliuchn  阅读(300)  评论(0编辑  收藏  举报