通俗的來講,python的高階函數(shù)的形參變量可以接受函數(shù),類似于c語言的函數(shù)指針
例如:
# 變量f可以傳入一個函數(shù)def add(a,b,f): return f(a)+f(b)add(-5,5,abs)#輸出結(jié)果是10map()是 Python 內(nèi)置的高階函數(shù),它接收一個函數(shù) f 和一個 list,并通過把函數(shù) f 依次作用在 list 的每個元素上,得到一個新的 list 并返回。
def format_name(s): return s[:1].upper()+s[1:].lower()PRint map(format_name, ['adam', 'LISA', 'barT'])reduce()函數(shù)也是Python內(nèi)置的一個高階函數(shù)。reduce()函數(shù)接收的參數(shù)和 map()類似,一個函數(shù) f,一個list,但行為和 map()不同,reduce()傳入的函數(shù) f 必須接收兩個參數(shù),reduce()對list的每個元素反復(fù)調(diào)用函數(shù)f,并返回最終結(jié)果值
def prod(x, y): return x*yprint reduce(prod, [2, 4,5])#輸出:40print reduce(prod, [2, 4,5],10)#輸出 400,先計算[..],在把10傳入filter()函數(shù)是 Python 內(nèi)置的另一個有用的高階函數(shù),filter()函數(shù)接收一個函數(shù) f 和一個list,這個函數(shù) f 的作用是對每個元素進(jìn)行判斷,返回 True或 False,filter()根據(jù)判斷結(jié)果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
import mathdef is_sqr(x): return math.sqrt(x)%1==0 print filter(is_sqr, range(1,101))# 輸出:# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]但 sorted()也是一個高階函數(shù),它可以接收一個比較函數(shù)來實現(xiàn)自定義排序,比較函數(shù)的定義是,傳入兩個待比較的元素 x, y,如果 x 應(yīng)該排在 y 的前面,返回 -1,如果 x 應(yīng)該排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。
def cmp_ignore_case(s1, s2): if s1.lower() < s2.lower(): return -1 elif s1.lower() > s2.lower(): return 1 else: return 0print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)# 輸出:# ['about', 'bob', 'Credit', 'Zoo']Python的函數(shù)不但可以返回int、str、list、dict等數(shù)據(jù)類型,還可以返回函數(shù)
函數(shù)calc_prod(lst),它接收一個list,返回一個函數(shù),返回函數(shù)可以計算參數(shù)的乘積
def calc_prod(lst): def prod(x,y): return x*y def lazy_prod(): return reduce(prod,lst) return lazy_prodf = calc_prod([1, 2, 3, 4])print f()# 輸出:24內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量),然后返回內(nèi)層函數(shù)的情況,稱為閉包(Closure)。
閉包的特點是返回的函數(shù)還引用了外層函數(shù)的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變。
# -*- coding: utf-8 -*-def count(): fs = [] for i in range(1, 4): print '函數(shù)賦值給變量時執(zhí)行' def f(): print '接受函數(shù)的變量執(zhí)行時調(diào)用' return i*i fs.append(f) return fsf1, f2, f3 = count()print f1()print f2()print f3()輸出:
函數(shù)賦值給變量時執(zhí)行函數(shù)賦值給變量時執(zhí)行函數(shù)賦值給變量時執(zhí)行接受函數(shù)的變量執(zhí)行時調(diào)用9接受函數(shù)的變量執(zhí)行時調(diào)用9接受函數(shù)的變量執(zhí)行時調(diào)用9關(guān)鍵字lambda 表示匿名函數(shù),冒號前面的 x 表示函數(shù)參數(shù)。 匿名函數(shù)有個限制,就是只能有一個表達(dá)式,不寫return,返回值就是該表達(dá)式的結(jié)果。
# 返回字符串,首字母大寫,其他字母小寫>>> map(lambda s:s[:1].upper()+s[1:].lower(),['barT','lISA','maggie'])['Bart', 'Lisa', 'Maggie']# 返回列表大于0的數(shù)值# lambda x: True if x>0 else False解釋:# 傳入x,x>0返回True否則返回False>>> print filter(lambda x: True if x>0 else False,[-1,1,-2,2,-3,3] )[1, 2, 3]如果定義了一個函數(shù),想要在運(yùn)行時候動態(tài)增加功能,又不想改動函數(shù)本身代碼
>>> def f_old(x):... return x*x...>>> def f_new(f):... def fn(x):... print 'fn()...'... return f(x)... return fn...# 第一種調(diào)用方法>>> g = f_new(f_old)>>> g(3)fn()...9# 第二種調(diào)用方法,完全隱藏了f_old()函數(shù)>>> f_old=f_new(f_old)>>> f_old(3)fn()...9# 第三種>>> @f_new... def f2(x):... return 2*x...>>> f2(3)fn()...6打印函數(shù)調(diào)用時間
import timedef performance(f): def fn(*args,**kw): t1=time.time() res=f(*args,**kw) t2=time.time() #print 'call'+f.__name__+'()...'+(t2-t1) print 'call %s() in %fs' %(f.__name__, (t2 - t1)) return res return fn@performancedef factorial(n): return reduce(lambda x,y: x*y, range(1, n+1))print factorial(10)# 輸出:# call factorial() in 0.000696s# 3628800請給 @performace 增加一個參數(shù),允許傳入’s’或’ms’:
import timedef performance(unit): def log(f): def fn(*args,**kw): t1 = time.time() res = f(*args,**kw) t2 = time.time() if unit == 'ms': t = (t2-t1)*1000 else: t= t2-t1 print ('call %s() in %f %s')%(f.__name__,t,unit) return res return fn return log@performance('s')def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1))print factorial(10)# 輸出:# call factorial() in 0.005046 s# 3628800簡化函數(shù)的參數(shù)默認(rèn)值 例子中sorted
函數(shù)的參數(shù)有兩個(list,cmp),第一個是列表,第二個是重寫的比較函數(shù)
新聞熱點
疑難解答