## map()
map()是 Python 內置的高階函數,它接收一個函數 f 和一個 list,并通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 并返回。
map()函數不改變原有的 list,而是返回一個新的 list。
利用map()函數,可以把一個 list 轉換為另一個 list,只需要傳入轉換函數。
由于list包含的元素可以是任何類型,因此,map() 不僅僅可以處理只包含數值的 list,事實上它可以處理包含任意類型的 list,只要傳入的函數f可以處理這種數據類型。
## reduce()
reduce()函數也是Python內置的一個高階函數。reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f,并返回最終結果值。
~~~
def f(x, y):
return x + y
~~~
**調用 reduce(f, [1, 3, 5, 7, 9])時,reduce函數將做如下計算:**
**先計算頭兩個元素:f(1, 3),結果為4;
再把結果和第3個元素計算:f(4, 5),結果為9;
再把結果和第4個元素計算:f(9, 7),結果為16;
再把結果和第5個元素計算:f(16, 9),結果為25;
由于沒有更多的元素了,計算結束,返回結果25。**
reduce()還可以接收第3個可選參數,作為計算的初始值。如果把初始值設為100,計算:
~~~
reduce(f, [1, 3, 5, 7, 9], 100)
125
~~~
可以利用reduce()函數求積
~~~
def prod(x, y):
return x*y
print reduce(prod, [2, 4, 5, 7, 12])
~~~
## filter()
filter()函數是 Python 內置的另一個有用的高階函數,filter()函數接收一個函數 f 和一個list,這個函數 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
~~~
import math
def is_sqr(x):
r=int(math.sqrt(x))
return r*r==x
print filter(is_sqr, range(1, 101))
結果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
~~~
## sorted()
sorted()也是一個高階函數,它可以接收一個比較函數來實現自定義排序,比較函數的定義是,傳入兩個待比較的元素 x, y,如果 x 應該排在 y 的前面,返回 -1,如果 x 應該排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。
如果我們要實現倒序排序,只需要編寫一個reversed_cmp函數:
~~~
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
~~~
這樣,調用 sorted() 并傳入 reversed_cmp 就可以實現倒序排序:
~~~
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
~~~
sorted()也可以對字符串進行排序,字符串默認按照ASCII大小來比較:
~~~
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
~~~