## 高階函數
* 一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
[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']
~~~