分享

从零开始学 Python 之高阶函数

 风声之家 2022-06-29 发布于江苏

原创 豆豆 豆豆的杂货铺 2022-06-15 08:15 发表于广东

我们都知道,Python 中的函数是可以有参数的,参数类型可以是字符串、整数或者其他数据类型。

那有没有可能把一个函数作为参数传递给另外一个函数呢?

完全可以,这就是我们今天要学习的高阶函数。

内置高阶函数

Python 总共内置了三个高阶函数,分别是 mapfilter 和 reduce

1、map

该函数接收两个参数,一个函数和一个序列,并将函数作用在序列的每个元素上,然后将处理之后的结果返回。

序列可以简单的理解为前面学习过的列表或元组。

比如现在我们需要对用户输入的英文名做校验,即除了第一个字母大写外,其余字母均为小写。正常来说你可以这么做。

def capitalize(name):
    return name.capitalize()

names = ['liSA''LiLI''LILEI']
for name in names:
    print(capitalize(name), end=' ')

# 输出结果
Lisa Lili Lilei 

但这么写有点复杂了,使用 map 之后就会变的非常简单了。

names = ['liSA''LiLI''LILEI']
new_names = map(capitalize, names)
print(list(new_names))

# 输出结果
['Lisa''Lili''Lilei']

我们只需要将函数 capitalize 和名字列表传入 map 函数,map 函数会自动格式化列表中的每一个名字,然后将结果返回给调用者。

2、filter

和 map 类似,该函数同样接受一个函数 f 和一个序列 list 作为参数。其作用就是判断序列中的每个元素是否符合函数 f 中的过滤条件,如果函数 f 返回 True,则保留,否则就过滤掉。

下面的例子会筛选出列表中的偶数。

普通写法:

def is_even(num):
    return num % 2 == 0

nums = [123456789]
new_nums = []
for num in nums:
    if is_even(num):
        new_nums.append(num)

print(new_nums)

# 输出结果
[2468]

使用 filter 写法:

nums = [123456789]
new_nums = filter(is_even, nums)
print(list(new_nums))

# 输出结果
[2468]

3、reduce

reduce 接收的参数和上面两个函数类似,都是一个函数 f 和一个序列 list,但其作用流程有所不同。

函数 f 必须接收两个参数 x 和 yreduce 每一次迭代都会将上一次作用于 x 的结果与本次迭代的参数 y 一起传入参数 f

看个 🌰

def add(x, y):
    return x + y
In [7]: nums = [12345678910]

In [8]: reduce(add, nums)
Out[8]: 55

其计算流程如下:

  1. 先计算前两个元素之和 add(1, 2) = 3
  2. 再把计算结果 3 和第三个元素传入 addadd(3, 3) = 6
  3. 再次把计算结果 6 和第四个元素传入 addadd(6, 4) = 10
  4. ...

以此类推,直到最后一个元素,得出结果 55。

确定

  • 不看此公众号

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多