高階函數
高階函數滿足上面至少一個特點。
- 能接收若干個函數作爲參數
- 能返回一個函數
import math
def add(x, y, f):
return f(x) + f(y)
# 平方和
print add(25, 9, math.sqrt)
map()函數
它接收一個函數 f 和一個list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。
def format_name(s):
a=s.lower()
return a[0].upper()+a[1:]
# 得到['Adam', 'Lisa', 'Bart']
print map(format_name, ['adam', 'LISA', 'barT'])
reduce()函數
它接收一個函數 f、一個list及一個可選的默認初始結果值,傳入的函數f必須接收兩個參數,reduce()對list的每個元素反覆調用函數f,並返回最終結果值。
def prod(x, y):
return x*y
#結果爲2*4*5*7*12=3360
print reduce(prod, [2, 4, 5, 7, 12])
filter()函數
filter()函數接收一個函數 f 和一個list,這個函數f的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件(函數返回true)元素組成的新list。
def is_not_empty(s):
return s and len(s.strip()) > 0
# 輸出['test', 'str', 'END']
filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
返回函數
函數可以返回一個函數,被返回的函數要在裏面定義,當作一個對象返回。
def calc_prod(lst):
def fun():
def prod(x,y):
return x*y
return reduce(prod,lst,1)
return fun
#輸出24 (4!=24)
f = calc_prod([1, 2, 3, 4])
print f()
閉包
在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。
函數定義和函數表達式位於另一個函數的函數體內。
函數A返回內部定義的函數B,則B爲閉包,調用A時傳遞的參數爲自由變量。
閉包特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回後不能變。
def count():
fs = []
for i in range(1, 4):
def product(a=i):
return a*a
fs.append(product)
return fs
f1, f2, f3 = count()
#返回 1 4 9
print f1(), f2(), f3()
decorator
裝飾器可簡化代碼,常用於:
- 打印日誌,@log
- 檢測性能,@performance
- 數據庫事務,@transaction
- URL路由,@post('/login')
Python的decorator本質上是一個高階函數,接收一個函數作爲參數,並返回一個新函數。
import time
def performance(f):
def fn(*args, **kw):
t1 = time.time()
r = f(*args, **kw)
t2 = time.time()
print 'call %s() in %fs' % (f.__name__, (t2 - t1))
return r
return fn
@performance
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
#結果:
#call factorial() in 0.009082s
#3628800
print factorial(10)
functools.partial
functools.partial用於創建偏函數,即可把一個參數多的函數變爲一個參數少的新函數,少的參數需要在創建時指定默認值,這樣,新函數調用的難度就降低了。
int2 = functools.partial(int, base=2)
# int(value,base=2),按照二進制將value轉爲十進制數值
#結果:64
int2('1000000')