函數式編程就是一種抽象程度很高的編程範式,純粹的函數式編程語言編寫的函數沒有變量,所以,任意一個函數,只要輸入是肯定的,輸出就是肯定的,這種純函數咱們稱之爲沒有反作用。函數式編程的一個特色就是,容許函數接收函數做爲參數,也容許把函數做爲返回值返回。Python對於函數式編程提供部分支持。因爲Python容許使用變量,所以Python不是純函數式編程語言。python
#高階函數 所謂高階函數,就是容許函數的參數接收其餘函數 下面介紹幾個python內置的高階函數:編程
##map() map()函數接收兩個參數,一個序列,一個函數。 map()的做用就是把傳入的函數依次做用於序列的元素,而後把結果做爲一個Iterator返回。bash
def function(x):
return x * x
r = map(function,[1,2,3,4,5])
print('map result:',list(r))
//運行結果:
//map result: [1, 4, 9, 16, 25]
複製代碼
#reduce() reduce()也接收兩個參數,一個函數,一個序列; reduce()也把函數做用在序列上,可是這個函數必須接收兩個參數,reduce把結果繼續和系列的下一個元素作累計計算。編程語言
from functools import reduce
def function1(x,y):
return x + y
reduce(function1,[1,2,3,4,5])
print('reduce result:',reduce(function1,[1,2,3,4,5]))
//運行結果:
//reduce result: 15
複製代碼
#filter() filter()的功能是過濾序列 跟map()相似,filter也接收一個函數一個序列 filter把函數做用於序列的每個元素,根據函數返回的True或者False決定元素的保留仍是去掉函數式編程
def isOdd(x):
return x % 2 == 1
p = list(filter(isOdd,[1,2,3,4,5]))
print('filter result:',p)
//運行結果:
//filter result: [1, 3, 5]
複製代碼
#sorted() 顧名思義,sorted()的功能就是對序列進行排序 sorted也是一個高階函數,能夠接受一個key函數。key指定的函數將做用於list的每一個元素上,並根據key函數返回的結果進行排序。函數
arr = [23,0,45,-13,46,85,-70];
print('sorted(arr):',sorted(arr))
#sorted(arr): [-70, -13, 0, 23, 45, 46, 85]
print('sorted(arr,key=abs):',sorted(arr,key=abs))
print('sorted(arr,key=abs,reverse=True)',sorted(arr,key=abs,reverse=True))
//運行結果:
//sorted(arr,key=abs): [0, -13, 23, 45, 46, -70, 85]
//sorted(arr,key=abs,reverse=True) [85, -70, 46, 45, 23, -13, 0]
複製代碼
#返回函數 高階函數不只能接受函數做爲參數,還能把函數做爲返回值返回。ui
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f = lazy_sum(1,2,3,4,5)
print(f)
print('f()=',f())
//運行結果:
//<function lazy_sum.<locals>.sum at 0x109c85950>
//f()= 15
#運行結果代表,當咱們調用lazy_sum的時候並不直接返回計算結果,而是返回sum函數,當咱們執行f()的時候纔會計算結果*
複製代碼
#匿名函數 有些時候咱們傳入一個函數做爲參數的時候,沒必要要每次都對他進行顯性的定義,python提供lambda建立匿名函數 匿名函數有一個如今就是隻能有一個表達式,不用寫return,表達式的結果就是返回值 匿名函數沒有名字因此不存在函數名衝突的問題,使用匿名函數利於減小代碼,這與python倡導理念也是一致的。spa
s = reduce(lambda x,y: x+y,[1,2,3,4,5])
print('s=',s)
//運行結果:
//s= 15
複製代碼
#偏函數 我理解的偏函數的功能是這樣的:code
假如你有一個這樣的函數:它的功能就是對人打招呼排序
def sayHello(name,greet):
print(greet,name)
複製代碼
假設接下來你要對名字是'xiaoMing'這我的,用一百種方式跟他打招呼。 若是你知道默認參數,那麼你確定會想到用它,固然沒錯,可是考慮到每次傳入實在是太麻煩了,因此:
def sayHelloToXiaoMing(greet,name='xiaoMing'):
return sayHello(name,greet)
sayHelloToXiaoMing('I love U');
複製代碼
其實sayHelloToXiaoMing就是sayHello的一個偏函數。 那麼偏函數的功能究竟是??沒錯,偏函數就是幫助咱們直接建立一個偏函數的,而不須要咱們本身去建立:
from functools import partial
sayHelloToTom = partial(sayHello,'Tom')
sayHelloToTom('Sawadika')
複製代碼
OK,關於函數式編程就簡單寫到這,代碼都很簡單就不給出源碼了~