Python之函數語言程式設計

Goyakod發表於2017-12-17

函數語言程式設計就是一種抽象程度很高的程式設計正規化,純粹的函數語言程式設計語言編寫的函式沒有變數,因此,任意一個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有副作用。函數語言程式設計的一個特點就是,允許函式接收函式作為引數,也允許把函式作為返回值返回。Python對於函數語言程式設計提供部分支援。由於Python允許使用變數,因此Python不是純函數語言程式設計語言。

#高階函式 所謂高階函式,就是允許函式的引數接收其他函式 下面介紹幾個python內建的高階函式:

##map() map()函式接收兩個引數,一個序列,一個函式。 map()的作用就是把傳入的函式依次作用於序列的元素,然後把結果作為一個Iterator返回。

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]
複製程式碼

#返回函式 高階函式不僅能接受函式作為引數,還能把函式作為返回值返回。

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倡導理念也是一致的。

s = reduce(lambda x,y: x+y,[1,2,3,4,5])

print('s=',s)
//執行結果:
//s= 15
複製程式碼

#偏函式 我理解的偏函式的功能是這樣的:

假如你有一個這樣的函式:它的功能就是對人打招呼

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,關於函數語言程式設計就簡單寫到這,程式碼都很簡單就不給出原始碼了~

相關文章