国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

2015/9/18Python基礎(14):函數式編程

2019-11-14 16:59:57
字體:
來源:轉載
供稿:網友

這篇寫了忘發。現在補上。

 


 

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是最好的方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和田县| 南康市| 集贤县| 永兴县| 富民县| 武穴市| 木兰县| 甘孜县| 濮阳市| 武功县| 邢台县| 襄垣县| 密山市| 曲水县| 定襄县| 青河县| 海原县| 正宁县| 铜川市| 花垣县| 邻水| 黑龙江省| 信阳市| 鄂托克前旗| 罗定市| 九江县| 三台县| 永德县| 旅游| 宁河县| 德州市| 黎平县| 巧家县| 仙居县| 塔城市| 新绛县| 延安市| 喀喇| 修武县| 贡嘎县| 工布江达县|