<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
眾所周知,Python 支援多種程式設計正規化:過程式(使用基礎的語句)、物件導向程式設計和函數語言程式設計。
Python 也提供了其他函數語言程式設計語言的工具:
在沒有迴圈的情況下處理可迭代物件:map
有時我們需要對列表、集合、字典等可迭代序列做的一個操作就是:對其中每一個元素值進行某種操作,把其結果收集起來。
比如選出資料庫中的某一列進行加減操作,或者針對某些特殊的值做平方的處理。
我們先來看一個例子:
>>> test = [1, 2, 3, 4, 5, 6] >>> square = [] >>> for x in test: square.append(x*x) >>> square [1, 4, 9, 16, 25, 36] >>>
此時就可以利用 Python
的 map
,允許您在不使用迴圈的顯式中處理和轉換所有專案,該技術通常稱為對映。當您需要將轉換函數應用於可迭代並將其轉換為新的迭代時,map 就能夠有其用武之地。
>>> test = [1, 2, 3, 4, 5, 6] >>> >>> def square(num): return num*num >>> list(map(square, test)) [1, 4, 9, 16, 25, 36] >>>
如上,我們會傳入一個自定義的函數 square()
來更加一般化地使用它,也就是對列表中的每一個元素都應用這個函數。
map 對列表中的每一個元素都呼叫了 square
函數,並將返回值收集到一個新的列表中。
正因為我們需要自定義一個 square 函數,結合上一篇文章 lambda
函數的簡單介紹中。我們可以利用 lambda 直接生成這個匿名函數,也就是可以寫出這樣的程式碼實現相同的功能:
>>> list(map((lambda x: x*x), test)) [1, 4, 9, 16, 25, 36] >>>
除了自定義函數,還可以 map 中傳入內建的 Python 函數。例如,如果您有一個字串列表,您可以輕鬆地建立一個計算該字串列表長度的新列表:
>>> name = ["Sam", "Dwen", "Kyrie"] >>> list(map(len, name)) [3, 4, 5] >>>
map 不單能實現 for 迴圈能實現的同樣的方式,還有效能優勢。map 的高階用法比如:在一個可序列型別中,map 會按照順序,並行地從各個序列中逐項取出一組又一組引數,然後傳入函數中:
>>> pow(2, 8) 256 >>> pow(3,8) 6561 >>> list(map(pow, [1,2,3], [8, 8, 8])) [1, 256, 6561] >>>
能看到上述程式碼的結果,map 對傳入的每個序列並行各自取一個值。
map 呼叫其實與列表推導式相似。
>>> test = [1, 2, 3, 4, 5, 6] >>> [x*x for x in test] [1, 4, 9, 16, 25, 36] >>> list(map((lambda x: x*x), test)) [1, 4, 9, 16, 25, 36]
但是 map 在一般情況下會比列表推導式執行更快,而且編寫的程式碼也會更少。而且有一點很重要:通過使用圓括號而不是方括號來包圍一個推導,能建立一個按需產生值的物件,減少了記憶體又減少了程式的響應時間。
map 函數是將 Python 函數語言程式設計工具集中一個主要也相對明確的代表。而 filter 和 reduce 分別實現了基於一個測試函數選擇可迭代物件的元素,以及向”元素對“ 應用函數的功能。
下面來看一個呼叫 filter 挑出一個序列中大於零的元素:
>>> list(range(-10, 10)) [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(filter((lambda x : x > 0), range(-10, 10))) [1, 2, 3, 4, 5, 6, 7, 8, 9]
filter 對於序列或可迭代物件中的元素,如果函數對該元素返回了 True 值,這個元素就會被加入到結果列表中。
與 map 一樣,filter 也能用一個 for 迴圈來等效,但是 filter 是內建的、簡明的,通常也執行得更快:
>>> result = [] >>> for x in range(-10, 10): if x > 0: result.append(x) >>> resullt [1, 2, 3, 4, 5, 6, 7, 8, 9]
同樣的功能,我們也能用列表推導式來實現:
>>> [x for x in range(-10,10) if x > 0] [1, 2, 3, 4, 5, 6, 7, 8, 9]
Python的 reduce()
是一種函數,它在 Python 標準庫中居住在一個名為 functools 的模組中:
from functools import reduce
通過 reduce 來計算一個列表中所有元素加起來的和:
>>> reduce((lambda x, y: x + y),[1,2,3,4,5]) 15
reduce
會將當前的和列表中的下一個元素傳入列出的 lambda 函數,在預設條件下,序列中的第一個元素初始化了起始值。
使用 reduce 的這種用法也與如下使用 for 迴圈實現了同樣的功能:
>>> test = [1, 2, 3, 4, 5] >>> result = test[0] >>> for x in test[1:]: result = result + x >>> result 15
到此這篇關於Python 函數程式設計式設計的三大法寶map+filter+reduce分享的文章就介紹到這了,更多相關Python 法寶map+filter+reduce內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45