手记

Python 高阶函数

高阶函数


关于 map/filter 跟生成器表达式进行对比时,简单介绍过两者。具体内容在下面文章:

本篇内容主要介绍三个高阶函数:mapfiltersorted。高阶函数(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 是一个 IteratorIteartor 是惰性序列,通过 list() 将整个序列计算出来并返回一个 list。

filter


filter(function, iterable) 函数,是用 iterable 中函数 function 返回真的那些元素,构建一个新的迭代器。

参数:

  • function: 作用于 iterable 的函数
  • iterable: 可以是序列,一个支持迭代的容器,或者一个迭代器。

filter 函数,如果 functionNone,则假设他是恒等函数,即 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]

functionNone 时,''0 并没有被返回。因为这里 Python 把 0 和空字符 '' 看成是 False,所以从中移除。

题外话:由于引入了列表推导和生成器表达式,map 和 filter 函数使用的频率也变低了。

sorted


sorted(iterable, *, key=None, reverse=False) 函数,根据 iterable 中的项返回一个新的已排序的列表。

参数:

  • iterable:可迭代对象
  • key:指定带有单个参数的函数,用于从 iterable 中每个元素提取用于比较的键。默认为 None
  • reverse:布尔值。设为 True,则每个元素将反向顺序进行排序。

其中 keyreverse 为可选参数 ,而且两者必须指定为关键字参数。

以下是 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() 函数的一些用法。

参考资料

来源

  1. David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O’Reilly Media.2013.
  2. Luciano Ramalho.Fluent Python.O’Reilly Media.2015
  3. “2. Built-in Functions”.docs.python.org.Retrieved 18 January 2020
  4. 廖雪峰.“Python 教程”.liaoxuefeng.com.[2020-01-17].

以上就是本篇的主要内容

1人推荐
随时随地看视频
慕课网APP