## 高阶函数
* 一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
[TOC]
>[info] #### 简单的高阶函数
~~~
def add(x, y, f):
return f(x) + f(y)
add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs
>>> add(-5, 6, abs)
11
~~~
>[info] #### map() 函数的用法
~~~
>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
['1', '2', '3', '4', '5', '6', '7', '8', '9']
~~~
>[info] #### reduce() 函数的用法
* reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数
* reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
~~~
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
~~~
~~~
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
~~~
>[info] #### filter() 过滤函数用法
* filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
~~~
def is_odd(n):
return n % 2 == 1
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# 结果: [1, 5, 9, 15]
~~~
>[info] #### sorted
* 通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1
* ##### 升序
~~~
>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
~~~
* ##### 倒序
~~~
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
~~~
~~~
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
~~~
* ##### 字符串排序
~~~
def cmp_ignore_case(s1, s2):
u1 = s1.upper()
u2 = s2.upper()
if u1 < u2:
return -1
if u1 > u2:
return 1
return 0
~~~
~~~
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
['about', 'bob', 'Credit', 'Zoo']
~~~