標籤:1.5 ace 映射 列表 cal position [1] 而不是 filter
防偽碼:忘情公子著
Python函數式編程:
函數式編程:
也稱作泛函編程,是一種編程範型,說白了就是實現可以把函數當參數傳遞給另一個函數;
它將電腦運算視為數學上的Function Compute,並且避免狀態以及可變資料;
函數式程式設計語言最重要的基礎是lambda演算,而且lambda演算的函數可以接受函數當作輸入和輸出
Python支援有限的函數式編程功能:
filter(func,seq):
調用一個布爾函數func來迭代遍曆每個seq中的元素;返回一個使func傳回值為true的元素的序列
In [1]: def a(x): ...: if x > 20: ...: return True ...: else: ...: return False ...: In [2]: l1 = [1,2,3,4,20,21,25,40,50,32,47]In [3]: filter(a,l1)Out[3]: [21, 25, 40, 50, 32, 47]
filter()是一個過濾器:
filter()為已知的序列的每個元素調用給定的布爾函數;
調用中,傳回值為非零值的元素將被添加至一個列表中
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/8B/DA/wKioL1hbN5vidLPzAABQNMAdVDI008.jpg" title="filter.jpg" width="700" height="333" border="0" hspace="0" vspace="0" style="width:700px;height:333px;" alt="wKioL1hbN5vidLPzAABQNMAdVDI008.jpg" />
map(func,seq1[,seq2...]):
將函數func作用於給定序列(s)的每個元素,並用一個列表來提供傳回值;
如果func為None,func表現為一個身份函數,返回一個含有每個序列中元素集合的n個元組的列表
In [1]: l1 = [0,1,2,3,4,5,6]In [2]: l2 = [‘Sun‘,‘Mon‘,‘Tue‘,‘Wed‘,‘Thu‘,‘Fri‘,‘Sat‘]In [3]: map(None,l1,l2)Out[3]:[(0, ‘Sun‘), (1, ‘Mon‘), (2, ‘Tue‘), (3, ‘Wed‘), (4, ‘Thu‘), (5, ‘Fri‘), (6, ‘Sat‘)]
In [4]: l1 = [0,1,2,3,4,5,6]In [5]: l2 = [‘Sun‘,‘Mon‘,‘Tue‘,‘Wed‘,‘Thu‘,‘Fri‘,‘Sat‘]In [6]: def a(x,y): #這裡的函數參數個數要與map函數中序列的個數一致 ...: return x*2,y*2 ...:In [7]: map(a,l1,l2)Out[7]:[(0, ‘SunSun‘), (2, ‘MonMon‘), (4, ‘TueTue‘), (6, ‘WedWed‘), (8, ‘ThuThu‘), (10, ‘FriFri‘), (12, ‘SatSat‘)]
map()是一個映射器;
map()將函數調用“映射”到每個序列的對應元素上並返回一個含有所有傳回值的列表。說白點也就是它能將不同序列的同一個位置上的元素通過func函數處理後整合成一個元組,最後產生一個元組列表
帶有單個隊列的map()如所示:
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/8B/E0/wKiom1hbZIPQj98mAABGdO_mNic651.jpg" title="map.jpg" alt="wKiom1hbZIPQj98mAABGdO_mNic651.jpg" />
帶有多個隊列的map()如所示:
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/8B/E0/wKiom1hbY6bBTigeAABmT2xwWRk646.jpg" title="map2.jpg" width="700" height="438" border="0" hspace="0" vspace="0" style="width:700px;height:438px;" alt="wKiom1hbY6bBTigeAABmT2xwWRk646.jpg" />
reduce(func,seq[,init]):
將二元函數作用於seq序列的元素,每次攜帶一對(先前的結果以及下一個序列元素),連續地將現有的結果和下一個值作用在獲得的隨後的結果上,最後減少我們的序列為一個單一的傳回值;如果初始值init給定,第一個比較會是init和第一個序列元素而不是序列的頭兩個元素
說白點reduce就是實現摺疊功能
In [9]: l1 = [0,1,2,3,4,5,6]In [10]: def a(x,y): ...: return x + y ...:In [11]: reduce(a,l1) #返回所有參數之和Out[11]: 21In [12]: reduce(a,l1,10) #返回所有參數+初始值之和Out[12]: 31
Python函數閉包:
閉包叫lexical closure(詞法閉包)。是指函數及相關的環境組成的整體。
閉包指的就是一個內層函數和所處的環境(外層函數)所構成的內容所組成的整體。
閉包只是在形式和表現上像函數,但事實上閉包自身並不是函數。
閉包從其表現的形式上可以解釋為函數在嵌套環境中,如果在一個內層函數裡對外層函數範圍中的變數進行了引用,那麼在外層函數返回後,內層函數依然可以使用其外層函數中被引用的變數,這種變數就構成了內層函數可以使用的環境。
In [1]: def func1(x): #外層函數 ...: def func2(y): #內層函數 ...: return y ** x ...: return func2 ...:In [2]: f4 = func1(4)In [3]: type(f4)Out[3]: functionIn [4]: f4(2)Out[4]: 16In [5]: f4(3)Out[5]: 81
In [6]: def startPos(m,n): #象棋起始位置 ...: def newPos(x,y): #象棋新位置 ...: return "The old position is (%d,%d),and the new position is (%d,%d)."% (m,n,m+x,n+y) ...: return newPos ...:In [7]: action = startPos(10,10)In [8]: action(1,2)Out[8]: ‘The old position is (10,10),and the new position is (11,12).‘In [9]: action = startPos(11,12)In [10]: action(3,-2)Out[10]: ‘The old position is (11,12),and the new position is (14,10).‘
對於外層函數中的變數施加了修改,內層函數也就相應的受到影響,所以說外層函數給內層函數提供了一個運行環境,這就叫做閉包。
本文出自 “忘情博” 部落格,請務必保留此出處http://itchentao.blog.51cto.com/5168625/1885110
python之函數式編程與函數閉包