高阶函数
python中,函数名可以作为变量使用,也可以作为参数传参进另外的函数中,此时另外的函数就称为高阶函数。
1 | def abs_add(x,y,f): |
此时调用
1 | abs_add(-5,4,abs) |
map/reduce
python中有两大内建函数,map与reduce。与大名鼎鼎的google map-reduce机制功能类似。
map
map()函数接受两个参数,第一个是函数,之后的是一个Iterable。关于Iterable的介绍在前面的文章中已经讲过,一般可以通过for循环的对象就是Iterable的。
map将传入的函数一次作用于序列的每个元素之上,然后再将运算结果作为新的相同的Iterable形式返回。map的函数参数作用是在序列的每个元素上,运算的结果也是有形同长的序列
1 | def f(x): |
reduce
reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。reduce的函数参数是依次作用在元素上,运算的结果也是一个确定的结果,一般不是序列
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
1 | from functools import reduce |
上面的运算中,首先使用序列的前两个元素计算结果,然后将结果与后面每个的元素一次次的计算。
1 | #str2int |
先用map将序列的每个char元素对应成int,之后再使用reduce将序列联结。
1 |
|
filter过滤器
filter()也接收一个函数和一个序列,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。filter的函数参数作用是在序列的每个元素上,运算的结果也是有形同长的序列
例如,在一个list中,删掉偶数,只保留奇数,可以这么写:
1 | def is_odd(n): |
把一个序列中的空字符串删掉,可以这么写:
1 | def not_empty(s): |
filter返回的是一个惰性序列,所以要强制计算出所有的元素,使用list方法。
实例
下面通过一个简单的小例子展示filter的魅力:
1 | #初始数据源,生成一个3以上的奇数序列 |
上面的代码可能直接硬吃不好理解,实际上是生成素数的序列,这个逻辑的前提是一种求素数序列的思路:
- 首先,列出从2开始的所有自然数,构造一个序列:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …
- 取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …
- 取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …
- 取新序列的第一个数5,然后用5把序列的5的倍数筛掉:
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …
- 不断筛下去,就可以得到所有的素数。
sorted
sorted(data, key=None, reverse=False) 函数是python的高级函数,可以参数表中的第一个列表进行排序
其中,data是待排序数据,可以使List或者iterator, cmp和key都是函数,这两个函数作用与data的元素上产生一个结果,sorted方法根据这个结果来排序。
key 是带一个参数的函数, 用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素.
通常, key 和 reverse 比 cmp 快很多, 因为对每个元素它们只处理一次; 而 cmp 会处理多次.
1 | sorted([36, 5, -12, 9, -21]) |