這篇寫了忘發。現在補上。
Python不是也不大可能成為一種函數式的編程語言,但是它支持許多有價值的函數式編程語言構建。
也有些表現的像函數式編程機制但是從傳統上也不能認為是函數式編程語言的構建。Python提供的以四中內建函數和lambda表達式的形式出現。
匿名函數與lambda
lambda [arg1, [arg2, ... argN]]:exPRession
Python允許用lambda關鍵字創造匿名函數。匿名是因為不需要以標準的方式來聲明。然而,作為函數,它們也能有參數。一個完整的lambda“語句”代表了一個表達式,這個表達式的定義體必須和聲明放在同一行。參數是可選的,如果用參數的話,參數通常也是表達式的一部分。
下例將展示單行語句和lambda語句的相似之處:
>>> def true(): return True>>> true()True>>> lambda :True<function <lambda> at 0x02BDA430>>>> fun = lambda :True>>> fun()True
下面是表達式的一些使用區別
def add(x, y): return x + ylambda x, y :x + ydef usuallyAdd2(x, y=2): return x + y #有默認參數lambda x, y=2: x + ydef showAllAsTuple (*z): return zlambda *z: z
lambda表達式運作起來就如一個函數,當被調用時,創造一個框架對象。將它賦值給一個對象后,該對象就是相應的函數。
內建函數
filter()
這個函數在給定一個對象序列和一個過濾函數后,每個序列元素通過這個過濾器進行篩選,保留返回為真的對象。
如果我們想自己編寫filter(),它大概是這樣的:
def filter(bool_func, seq):
filtered_seq = [] for eachItem in seq: if bool_func(eachItem): filtered_seq.append(eachItem) return filtered_seq
map()
map()內建函數和filter()相似,因為它也能通過函數來處理序列。然而,不像filter(),map()將函數調用“映射”到每個序列的元素上,并返回一個含有所有返回值的列表。
如果我們想自己編寫map(),它大概是這樣的:
def map(func, seq): mapped_seq = [] for eachItem in seq: mapped_seq.append(func(eachItem)) return mapped_seq
reduce()
reduce()使用了一個二元函數,一個序列,和一個可選的初始化器,卓有成效地將那個列表的內容“減少”為一個單一的值,如同它的名字一樣。在其他語言中,這種概念稱為折疊。
它通過取出序列的頭兩個元素,將他們傳入二元函數來獲得一個單一的值來實現,然后又用這個值和序列的下一個元素來獲得又一個值,然后直到整個序列都遍歷完畢以及最后的值會被計算出來為止。
如果我們想自己編寫reduce(),它大概是這樣:
def reduce(bin_func, seq, init=None): Iseq = list(seq) # convert to list if init is None: # initializer? res = lseq.pop(0) # no else: res = init # yes for item in lseq: # reduce sequence res = bin_func(res, item) # apply function return res # return result
偏函數應用
偏函數應用(partial function application, PFA),這種函數將任意數量(順序)的參數的函數轉化成另一個帶剩余參數的函數對象。
這個概念和currying的概念有相關,currying也就是科里化,是指把原本接受多個參數的函數變換為接受一個單一參數的函數,并且返回接受余下參數且返回結果的新函數的技術。
這講起來有些抽象,可以認為這個不提供參數就會使用默認參數的情形相似。在PFA的例子中,參數不需要調用函數的默認值,只需明確調用集合。
如下例子:
>>> from Operator import add,mul>>> from functools import partial>>> add1 = partial(add,1)>>> add1(10)11>>> mul100 = partial(mul, 100)>>> mul100(5)500
上述的這種偏函數調用很無聊,并沒有顯現出偏函數的威力,但是這能讓我們知道如何使用它。當調用帶許多參數的函數的時候,PFA是最好的方法。
新聞熱點
疑難解答