python之函數式編程與函數閉包

來源:互聯網
上載者:User

標籤: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之函數式編程與函數閉包

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.