高阶函数
关于 map/filter
跟生成器表达式进行对比时,简单介绍过两者。具体内容在下面文章:
本篇内容主要介绍三个高阶函数:map
,filter
和 sorted
。高阶函数(higher-order function)的定义,既是接受函数为参数,或者把函数作为结果返回的函数。
map
map(function, iterable, ...)
函数,返回一个将 function
应用到 iterable
中每一项并输出其结果的迭代器。
参数:
function
: 用于作用于序列每个元素的函数iterable
: 需要进行处理的序列- …: 额外的
iterable
参数
map
可以接受额外 iterable
参数,function
必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。有多个可迭代对象的时候,最短的可迭代对象耗尽则整个迭代就结束。
代码实现函数 f(x)=x2f(x)=x^2f(x)=x2,示例如下:
>>> def f(x):
... return x * x
...
>>> result = map(f, [1,2,3,4,5,6,7,8,9])
>>> list(result)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
这里传入的 f
是函数对象本身。map
返回的结果 result
是一个 Iterator
,Iteartor
是惰性序列,通过 list()
将整个序列计算出来并返回一个 list。
filter
filter(function, iterable)
函数,是用 iterable
中函数 function
返回真的那些元素,构建一个新的迭代器。
参数:
function
: 作用于iterable
的函数iterable
: 可以是序列,一个支持迭代的容器,或者一个迭代器。
filter
函数,如果 function
是 None
,则假设他是恒等函数,即 iterable
中所有返回 False 的元素会被移除。
例如,返回 list 列表中的奇数:
>>> def is_odd(num):
... return num % 2 == 1
...
>>> list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
[1, 3, 5, 7, 9]
再看传入第一个参数为 None
的例子:
>>> list(filter(None, ['', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
function
为 None
时,''
和 0
并没有被返回。因为这里 Python 把 0
和空字符 ''
看成是 False
,所以从中移除。
题外话:由于引入了列表推导和生成器表达式,map 和 filter 函数使用的频率也变低了。
sorted
sorted(iterable, *, key=None, reverse=False)
函数,根据 iterable
中的项返回一个新的已排序的列表。
参数:
iterable
:可迭代对象key
:指定带有单个参数的函数,用于从iterable
中每个元素提取用于比较的键。默认为None
reverse
:布尔值。设为True
,则每个元素将反向顺序进行排序。
其中 key
,reverse
为可选参数 ,而且两者必须指定为关键字参数。
以下是 sorted
简单的用法:
>>> lst = [4, 2, 5, 3, 1]
>>> sorted(lst)
[1, 2, 3, 4, 5]
再看字符串排序的示例:
>>> s = ['Leijun', 'Allen', 'pony', 'jacky']
>>> sorted(s)
['Allen', 'Leijun', 'jacky', 'pony']
对于字符串排序,根据的是 ASCII
的大小比较的,这里 'L' < 'j'
,所以 L
会排在 j
前面。
为了达到忽略大小写的排序,这里可以使用 key
函数把字符串映射称忽略大小写即可。
示例,使用 key
进行排序:
>>> sorted(s, key=str.lower)
['Allen', 'jacky', 'Leijun', 'pony']
若需要反向排序,直接传入参数 reverse=True
:
>>> sorted(s, key=str.lower, reverse=True)
['pony', 'Leijun', 'jacky', 'Allen']
这就是 sorted()
函数的一些用法。
参考资料
来源
- David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O’Reilly Media.2013.
- Luciano Ramalho.Fluent Python.O’Reilly Media.2015
- “2. Built-in Functions”.docs.python.org.Retrieved 18 January 2020
- 廖雪峰.“Python 教程”.liaoxuefeng.com.[2020-01-17].
以上就是本篇的主要内容