極客饕餮 2018-09-17 16:55:05 ラムジ - PLANET.mp3 04:07.537000000000006 來自極客饕餮 每天堅持系統(tǒng)學(xué)習(xí)python,我在路上 一 高階函數(shù)函數(shù)式編程的關(guān)鍵是高階函數(shù),高階函數(shù)將其他函數(shù)作為參數(shù),或?qū)⑵渥鳛閰?shù)返回. 例如: def apply_twice(func,arg): return func(func(arg)) def add_five(x): return x+5 print(apply_twice(add_five,10)) 結(jié)果:20 函數(shù)apply_twice將另一個函數(shù)add_five作為參數(shù),并在其內(nèi)部調(diào)用兩次. 二 純函數(shù)函數(shù)式編程試圖使用純函數(shù).純函數(shù)沒有副作用,并且返回一個僅依賴于它們的參數(shù)的值. 這是數(shù)學(xué)工作中的函數(shù):例如,對于相同的x,cos(x)總是返回相同的結(jié)果. 純函數(shù)的例子: def pure_function(x,y): temp=x+2*y return temp/(2*x+y) 非純函數(shù)的例子: some_list=[] def impure(arg): some_list=append(arg) 上面的函數(shù)就不是純函數(shù),因為它改變了some_list的狀態(tài). 純函數(shù)的優(yōu)缺點: 優(yōu)點: --更容易推理和測試. --更高效.一旦函數(shù)有一個輸入,結(jié)果可以被存儲并在下一次需要該輸入的函數(shù)時被引用. 從而減少函數(shù)被調(diào)用的次數(shù).這被稱為memoization. --更容易并行運行 缺點:使得I/O的其他簡單任務(wù)復(fù)雜化. 在某些情況下,它們將更難編寫. 三 lambda表達式正常創(chuàng)建一個函數(shù)(使用def)會自動將其分配給一個變量. 這與其他對象(如字符串和整數(shù))的創(chuàng)建不同,它們可以在運行中創(chuàng)建,而不必將其分配給變量. 使用lambda語法創(chuàng)建函數(shù).這種方式創(chuàng)建的函數(shù)被稱為匿名函數(shù). 將一個簡單函數(shù)作為參數(shù)傳遞給另一個函數(shù)時,這種方法最常用. 語法如下: def my_func(f,arg): return f(arg) my_func(lambda x:2*x*x,5) lambda表達式?jīng)]有命名函數(shù)強大.它們只能做單一表達的事情--通常相當于一行代碼 例如: def polynomial(x): return x**2+5*x+4 print(polynomial(-4)) #lambda print((lambda x:x**2+5*x+4)(-4)) 結(jié)果: 0 0 在上面的代碼中,我們創(chuàng)建了一個匿名函數(shù),并用參數(shù)調(diào)用它 可以將lambda函數(shù)分配給變量,并像普通函數(shù)一樣使用. 例如: double=lambda x:x*2 print(double(7)) 結(jié)果: 14 ★但是,很少這樣做.用def定義一個函數(shù)通常會更好. 下面是一個例子: triple=lambda x:x*3 add=lambda x,y:x+y print(add(triple(3),4)) 結(jié)果:13 四 map和filter內(nèi)置的函數(shù)map和filter是在列表(或類似的稱為迭代的對象)上運行的非常有用的高階函數(shù) 函數(shù)map接收一個函數(shù)和一個迭代器作為參數(shù),并返回一個新的迭代器,該函數(shù)應(yīng)用于每個參數(shù). 例如: def add_five(x): return x+5 nums=[11,22,33,44,55] result=list(map(add_five,nums)) print(result) 結(jié)果: [16,27,38,49,60] 通過使用lambda語法,我們可以更容易地獲得相同的結(jié)果, nums=[11,22,33,44,55] result=list(map(lambda x:x+5,nums)) print(result) 為了將結(jié)果轉(zhuǎn)換為列表,我們使用了list函數(shù) filter函數(shù)通過刪除與謂詞(一個返回布爾值的函數(shù))不匹配的項來過濾一個迭代 例如: nums=[11,22,33,44,55] res=list(filter(lambda x:x%2==0,nums)) print(res) 結(jié)果: [22,44] 與map一樣,如果要打印結(jié)果.必須將結(jié)果顯式轉(zhuǎn)換為列表. 下個例子:從列表中刪除所有大于4的項目 nums=[1,2,,5,8,0,7,12] res=list(filter(lambda x:x<5,nums)) print(res) |
|