python初识四大高阶函数map, reduce, filter, sorted

python初识四大高阶函数map, reduce, filter, sorted

1. 为什么叫初识呢?

为什么是初识, 而不是进阶, 那就先来看看, 什么是高阶函数

高阶函数: 一个函数接收另一个函数作为自身的参数的叫做高阶函数

函数可以当作参数来传递?参数接收的不是变量吗

>>> sum([10, 100])  # 介绍一下熟悉的 sum 内置方法
110
>>> sum  # 如果只输入一个 sum, 然后回车, 发现它是个函数
<built-in function sum>
>>> s = sum([10, 100])  # 如果这样赋值给 s
>>> s  # 使用火眼金睛瞟一眼 s, 发现 s 是接收了调用 sum 后的返回值
110
>>> sum = 10  # 如果这样赋值给 sum
>>> sum # 然后再用火眼金睛瞟一眼 sum, 发现它已经被超度, 变成了 10, 是一个 int 类型, 不能够调用了
10

  从以上的例子, 我们可以知道什么?

我们可以了解到, 
(1) 函数名其实是函数本身,
(2) 而函数名()是调用函数,
(3) 变量可以接收函数调用后的返回值, 即是说变量可以被赋值,
(4) 而函数名本身也是变量, 它也可以被重新赋值

 因为它是个函数, 可以被调用, 不是一般的变量, 当作参数去传递给另一个函数, 那么另一个函数就不是一般的函数, 是高阶函数.

又因为, 以后还会接触到更高级的高阶函数, 所以这里称作初识.

2. map(function, iterable) 函数

"三围"介绍: 参数, 功能, 返回值

参数:
function: 一个函数, 可以是自定义的, 也可以是内置的
iterable: 一个可迭代的对象
功能:
逐一取出 iterable 参数中的值, 并根据 function 参数的规则执行, 最后返回一个迭代器 iterator
返回值:
一个迭代器

 演示代码:

# 计算已知列表中的每一个数的平方
# 普通计算的方式也许是这样
lst = [1, 2, 3, 4, 5]
res_lst = []
for i in lst:
    res_lst.append(i ** 2)

# 或者使用推导式, 比如这样
lst = [1, 2, 3, 4, 5]
res_lst = [x*x for x in lst]

# 而使用 map 函数可以这样
lst = [1, 2, 3, 4, 5]
res_iter = map(lambda x: x * x, lst)
res_lst = list(res_iter)

 这样使用 map 好像没有觉得它多么有优势啊, 不就在于迭代器, 减少了内存吗(前面的文章已有介绍, 有关迭代器的优势).那么再来看一个例子:

# 计算出一个已知罗马数字的数列所对应的值 (题目参考 LeetCode 第13题)(不必在意算法的过程哈)
def romanToInt(s):
    code = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}
    ans = 0
    for i in range(len(s) - 1):
        # such as CM
        if code[s[i]] < code[s[i + 1]]:
            ans -= code[s[i]]
        else:
            ans += code[s[i]]
    return ans + code[s[-1]]


# 那么使用 map 就显得有些优势了, 再自己验证自己的算法结果的时候, 就可以不一个个的验证了
strs = ['III', 'IV', 'IX', 'LVIII', 'MCMXCIV']
print(list(map(romanToInt, strs)))

 执行结果:

[3, 4, 9, 58, 1994]

3. reduce(function, iterable) 函数

 "三围"介绍: 参数, 功能, 返回值

参数:
function: 内置函数 或者 自定义函数
iterable: 可迭代性数据
功能:
依次将 iterable 中的前两个数据取出, 依据 function 制定的规则计算结果, 再将结果与第三个元素计算, 依次类推.
返回值:
计算的最终结果

演示代码:

# 将一个列表的数变为一个整数
from functools import reduce
lst = [2, 0, 1, 9]
res = reduce(lambda x, y: x * 10 + y, lst)
print(res)

执行结果:

2019

4. filter(function, iterable) 函数

惯例的"三围"介绍:

参数:
function: 一个函数
iterable: 可迭代型数据
功能:
根据function的返回值, 进行过滤数据, 如果function 的返回值为真则保留, 否则舍弃
返回值:
一个迭代器

演示代码:

lst = list(filter(lambda x: 2 < x < 10 and x % 2 == 0, [v for v in range(18)]))
print(lst)

执行结果:

[4, 6, 8]

5. sorted(iterable, *, key=None, reverse=False) 函数

惯例的"三围"介绍:

参数:
iterable: 可迭代型数据(常用: 容器类型数据 range对象 迭代器)
reverse = False 从小到大排序(升序, 正序)
reverse = True  从大到小排序(降序, 倒序)
key = 一个函数
功能: 排序
把可迭代性的数据进行排序.
返回值:
排序后的结果

演示代码:

# 一组学生姓名和成绩, 使用 sorted 进行排序
lst = [('Bob', 75), ('Adam', 92), ('Trent', 99), ('Lisa', 88)]
res = sorted(lst)
# sorted 与 sort 函数不同, sorted 不会改变原数据, 就近比较
print(res)
print(lst)

执行结果:

排序后: [('Adam', 92), ('Bob', 75), ('Lisa', 88), ('Trent', 99)]
原数据: [('Bob', 75), ('Adam', 92), ('Trent', 99), ('Lisa', 88)]

演示代码2:

# 一组学生姓名和成绩, 使用 sorted 根据成绩进行降序排序
lst = [('Bob', 75), ('Adam', 92), ('Trent', 99), ('Lisa', 88)]
res = sorted(lst, key=lambda tp: tp[1], reverse=True)
print(res)

执行结果:

[('Trent', 99), ('Adam', 92), ('Lisa', 88), ('Bob', 75)]

猜你喜欢

转载自www.cnblogs.com/trent-fzq/p/10908132.html