python函數(shù)式編程

函數(shù)式編程

簡介:一種編程范式

  1. 把計算視為函數(shù)而非指令
  2. 純函數(shù)式編程:不需要變量匆背,沒有副作用剧包,測試簡單
  3. 支持高階函數(shù)核偿,代碼簡單

高階函數(shù):

能接收函數(shù)做參數(shù)的函數(shù)

  • 變量可以指向函數(shù)
  • 函數(shù)的參數(shù)可以接收變量
  • 一個函數(shù)可以接收另一個函數(shù)作為參數(shù)
  • 能接收函數(shù)作為參數(shù)的函數(shù)被稱為高階函數(shù)

eg1:

def add(x,y,f):
   return f(x)+f(y)
print add(0,4,math.sqrt)    #注意不是math.sqrt()

eg2:

def format_name(s):
    return s[0].upper()+s[1:].lower()
print map(format_name, ['adam', 'LISA', 'barT'])

eg3:

def is_sqr(x):
    if int(math.sqrt(x)) == math.sqrt(x):
        return x
print filter(is_sqr, range(1, 101))

python 中返回函數(shù)(一個函數(shù)執(zhí)行的結(jié)果是返回另一個函數(shù))

eg:1

def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum

使用f的時候并沒有調(diào)用它(延遲求值)

>>> f = calc_sum([1, 2, 3, 4])
>>> f
<function lazy_sum at 0x1037bfaa0>   
>>> f()
10

eg2:

def calc_prod(lst): 
   def lazy_prod():
       def prod(x,y):
           return x*y
       return reduce(prod,lst)
   return lazy_prod
f = calc_prod([1, 2, 3, 4])
print f()

python閉包:

概念:內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量)迹缀,然后返回內(nèi)層函數(shù)的情況瓦糕,稱為閉包(Closure)胁艰。(如上calc_prod函數(shù)中款筑,內(nèi)部的reduce函數(shù)引用了 外部的lst變量)

閉包的特點是返回的函數(shù)還引用了外層函數(shù)的局部變量,所以腾么,要正確使用閉包奈梳,就要確保引用的局部變量在函數(shù)返回后不能變。

eg1:

def count():
    fs =[]
    for i in range(1,4):
        def f():
            return i*i
        fs.append(f)
    return fs
f1,f2,f3 =count()
print(f1(),f2(),f3())

結(jié)果不是1解虱,4攘须,9 而是9,9殴泰,9于宙,因為return的時候fs里面三個函數(shù)都沒有執(zhí)行,參數(shù)都是i悍汛,在調(diào)用的時候才開始執(zhí)行捞魁,而此時i已經(jīng)變成的。因此离咐,返回函數(shù)不要引用任何循環(huán)變量谱俭,或者后續(xù)會發(fā)生變化的變量。(take this sentence in mind)

注意:python函數(shù)加不加括號問題

1宵蛀、不帶括號時昆著,調(diào)用的是這個函數(shù)本身 (比如上面函數(shù)式編程)
2、帶括號(此時必須傳入需要的參數(shù))糖埋,調(diào)用的是函數(shù)的return結(jié)果(加括號就是調(diào)用了)

python匿名函數(shù):

利用lambda表達(dá)匿名返回值而不是return

def is_not_empty(s):
   return s and len(s.strip()) > 0

化簡為:

print filter(lambda s: s and len(s.strip())>0, ['test', None, '', 'str', '  ', 'END'])

python裝飾器decorator

接收 一個函數(shù)對其包裝然后返回一個新函數(shù)宣吱,用于對原函數(shù)功能進(jìn)行增加又不想修改原函數(shù)的代碼

def f1(x):
    return x*2
def newf(f):
    def fn(x):
        print('new functions')
        return f(x)
    return fn

使用方法

g1 = newf(f1)
print g1(5)
or
f1 = new_fn(f1)
print f1(5)

這樣就徹底隱藏了f1函數(shù)

python內(nèi)置的@語法用來簡化裝飾器的調(diào)用

@newf
def f1(x)
    return x*2

等價于

def f1(x):
    return x*2
f1 =newf(f1)

即把f1包含在了newf里面并返回一個函數(shù)名還是f1的新的函數(shù),因而在調(diào)用f1時瞳别,原來的newf也同時被執(zhí)行了征候。想想@log就能明白了杭攻,執(zhí)行@log下面的函數(shù)時,log也被打印出來疤坝,而新函數(shù)的函數(shù)名還是@log下面的函數(shù)名

def log1(f):
      print("print log")
      return f
@log1
def d(x):
    print(x)

output

print log
1

把d(x)變成了

def d(x):
   print("print log")
   print(x)

裝飾器模塊后續(xù)更新:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兆解,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子跑揉,更是在濱河造成了極大的恐慌锅睛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件历谍,死亡現(xiàn)場離奇詭異现拒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)望侈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門印蔬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脱衙,你說我怎么就攤上這事侥猬。” “怎么了捐韩?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵退唠,是天一觀的道長。 經(jīng)常有香客問我荤胁,道長瞧预,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任仅政,我火速辦了婚禮松蒜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘已旧。我一直安慰自己,他們只是感情好召娜,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布运褪。 她就那樣靜靜地躺著,像睡著了一般玖瘸。 火紅的嫁衣襯著肌膚如雪秸讹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天雅倒,我揣著相機(jī)與錄音璃诀,去河邊找鬼。 笑死蔑匣,一個胖子當(dāng)著我的面吹牛劣欢,可吹牛的內(nèi)容都是我干的棕诵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凿将,長吁一口氣:“原來是場噩夢啊……” “哼校套!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牧抵,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤笛匙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后犀变,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妹孙,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年获枝,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠢正。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡映琳,死狀恐怖机隙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萨西,我是刑警寧澤有鹿,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站谎脯,受9級特大地震影響葱跋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜源梭,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一娱俺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧废麻,春花似錦荠卷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怜姿,卻和暖如春慎冤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沧卢。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工蚁堤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人但狭。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓披诗,卻偏偏與公主長得像撬即,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子藤巢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)式編程就是一種抽象程度很高的編程范式搞莺,純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量,因此掂咒,任意一個函數(shù)才沧,只要輸入是確...
    齊天大圣李圣杰閱讀 1,532評論 0 2
  • 函數(shù)是Python內(nèi)建支持的一種封裝,我們通過把大段代碼拆成函數(shù)绍刮,通過一層一層的函數(shù)調(diào)用温圆,就可以把復(fù)雜任務(wù)分解成簡...
    祐吢房_2c9a閱讀 393評論 1 1
  • functional函數(shù)式。 特點 把計算視為函數(shù)而非指令 純函數(shù)式編程不需要變量孩革,沒有副作用(任意執(zhí)行多少次結(jié)果...
    WilliamY閱讀 335評論 0 2
  • 本文翻譯自Functional Programming Howto 本文將介紹Python中函數(shù)式編程的特性岁歉。在對...
    大蟒傳奇閱讀 2,617評論 4 14
  • 原以為會看不進(jìn)去的,可是點進(jìn)去后也是很意外的膝蜈。意外的是我并沒有感覺到不耐煩锅移,而是就這樣也不急躁的看下去。 ...
    陽光下的野草閱讀 372評論 0 0