函數(shù)是編程是一種抽象程度很高的編程范式。特點(diǎn)之一是允許將函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù)。并且允許返回一個(gè)函數(shù)。
1 高階函數(shù)
變量可以指向的函數(shù)
f = abs
其中abs為一個(gè)函數(shù),即變量f指向abs本身。
函數(shù)名也是變量
abs()是函數(shù),abs其實(shí)是一個(gè)指向該函數(shù)的變量。
ps:abs定義在__builtin__模塊中。
傳入函數(shù)
函數(shù)的參數(shù)可以接受變量,那么也可以接受其實(shí)是變量的函數(shù)名。
>>>def add(x, y, f):
return f(x) + f(y)
>>>add(-9, 6, abs)
15
實(shí)際上就是abs(-9) + abs(6)的過程。
總結(jié):把函數(shù)作為參數(shù)傳入,這樣的函數(shù)就是高階函數(shù)。
2 map() / reduce()
map()
接受兩個(gè)參數(shù):函數(shù)與序列。
map(f, [ something ])
map(str, [1, 2, 3, 4, 5, 6]) ==> ['1', '2', '3', '4', '5', '6']
實(shí)際上map()是把計(jì)算過程抽象化了。
reduce()
接收兩個(gè)參數(shù):函數(shù)和序列。
與map()不同的是,reduce將接收到的函數(shù)作用在序列的每一個(gè)元素上并將其累計(jì)計(jì)算。
>>> def fn(x, y):
return x * 10 + y
>>> reduce(fn, [1, 3, 5, 7, 9])
13579
3 filter()
filter()接收一個(gè)函數(shù)和一個(gè)序列。
它將傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值決定保留或是丟棄。
例:找1~100之間的素?cái)?shù)
def is_prime(n):
if n == 1:
return True
else:
for i in range(2, n-1):
if n % i == 0:
return False
return True
print filter(is_prime, range(1, 101))
結(jié)果:[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
4 sorted()
排序算法
通常規(guī)定,對(duì)于兩個(gè)元素x和y,如果認(rèn)為x < y,則返回-1,如果認(rèn)為x == y,則返回0,如果認(rèn)為x > y,則返回1,這樣,排序算法就不用關(guān)心具體的比較過程,而是根據(jù)比較結(jié)果直接排序。
>>> 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
傳入自定義的比較函數(shù)reversed_cmp,就可以實(shí)現(xiàn)倒序排序:
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
5 返回函數(shù)
函數(shù)作為返回值
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
每次返回的函數(shù)都是新的。
閉包
返回函數(shù)不要應(yīng)用任何循環(huán)變量,或是后續(xù)會(huì)發(fā)生變化的變量。