Python之函數式編程

函數式編程就是一種抽象程度很高的編程範式,純粹的函數式編程語言編寫的函數沒有變量,所以,任意一個函數,只要輸入是肯定的,輸出就是肯定的,這種純函數咱們稱之爲沒有反作用。函數式編程的一個特色就是,容許函數接收函數做爲參數,也容許把函數做爲返回值返回。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,關於函數式編程就簡單寫到這,代碼都很簡單就不給出源碼了~

相關文章
相關標籤/搜索