先说什么是高阶函数,高阶函数是指可以接受函数作为参数、或者可以把函数作为结果返回的函数,这种函数就是高阶函数。
使用最常见的内置高阶函数有map、sorted、filter与reduce。目前个人还常用的只有sorted和map这两个了。因为python自从引入列表推导式和生成器表达式过后,有些内置高阶函数就可以不再使用了。
sorted
sorted可选key参数传递一个函数,它会应用到各个元素上并依此进行排序。
s = ["1bd", "5s", "354d", "4ghds"]
# 按列表中每个元素的[0]位排序
sorted(s, key=lambda x:x[0])
>>> ['1bd', '354d', '4ghds', '5s']
# 按每个元素的长度排序
sorted(s, key=len)
>>> ['5s', '1bd', '354d', '4ghds']
map
map的作用是将一个函数作用在一个可迭代的对象的每一个元素上,并返回一个生成器。
s = ["1bd", "5s", "354d", "4ghds"]
# 对每个元素截取前两位,list是将生成器对象转换为列表
list(map(lambda x:x[:2], s))
>>> ['1b', '5s', '35', '4g']
由于列表推导式和生成器表达式的出现,几乎所有使用map的场景都能使用它们来完成,可将上诉map方式改为如下:
# 列表推导式写法
[i[:2] for i in s]
>>> ['1b', '5s', '35', '4g']
# 生成器表达式写法
(i[:2] for i in s)
>>> <generator object <genexpr> at 0x10d691d68>
filter 和 reduce
filter是用于过滤的高阶函数,使用方式如下:
# 返回range(6)中为偶数的元素
list(filter(lambda x:x%2==0, range(6)))
>>> [0, 2, 4]
使用列表推导式替换如下:
[i for i in range(6) if i%2==0]
>>> [0, 2, 4]
使用列表推导式的可读性其实更强。
reduce是累加操作的,这里就不再做过多演示,当前基本可以使用sun()函数来直接完成求和,而不需再使用类似reduce(add, range(6))的方式进行求和操作,且目前Python3中,reduce已不再是内置函数了。
自己目前除了sorted在用、map偶尔使用之外,貌似更多还是用的列表推导式或者生成器表达式来完成一些相关的操作了。
网友评论