国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python函數(shù)式編程之lambda表達(dá)式,reduce函數(shù)、map函數(shù)、filter函數(shù)

2019-11-08 03:10:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

函數(shù)式編程就是對(duì)一個(gè)序列應(yīng)用一些函數(shù)工具。在Python中,reduce、map、filter都是函數(shù)式編程工具。

一、lambda表達(dá)式 lambda只是一個(gè)表達(dá)式,函數(shù)體比def簡(jiǎn)單很多。 lambda的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。 lambda表達(dá)式是起到一個(gè)函數(shù)速寫(xiě)的作用。允許在代碼內(nèi)嵌入一個(gè)函數(shù)的定義。

例子1:定義了一個(gè)lambda表達(dá)式,求三個(gè)數(shù)的和。 這里寫(xiě)圖片描述

例子2:用lambda表達(dá)式求n的階乘。 這里寫(xiě)圖片描述

二、map函數(shù) map函數(shù)應(yīng)用于每一個(gè)可迭代的項(xiàng),返回的是一個(gè)結(jié)果list。如果有其他的可迭代參數(shù)傳進(jìn)來(lái),map函數(shù)則會(huì)把每一個(gè)參數(shù)都以相應(yīng)的處理函數(shù)進(jìn)行迭代處理。map函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是序列,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的list返回。

格式

map(func, seq1[, seq2...] )

map可以使用任何的lambda函數(shù)操作,本質(zhì)上是把原有的list根據(jù)lambda法則變成另外一個(gè)list,例子如下:

l = [1,2,3]new_list = list(map(lambda i: i+1, l))PRint(new_list)# Py3里,外面需要套個(gè)list:這是為了讓里面的值給顯示出來(lái),要不然你會(huì)得到這是個(gè)map函數(shù)而不是里面的值。Py2的童鞋不需要# 我們也可以把兩個(gè)數(shù)組搞成一個(gè)單獨(dú)的數(shù)組l2 = [4,5,6]new_list = list(map(lambda x,y: x+y, l, l2))print(new_list)

三、reduce函數(shù) reduce函數(shù)也是Python內(nèi)置的一個(gè)高階函數(shù)。在python 3.0.0以后, reduce已經(jīng)不在built-in function里了, 要用它就得在文件開(kāi)頭寫(xiě)入

from functools import reduce

reduce函數(shù)接收的參數(shù)和map類(lèi)似,一個(gè)函數(shù)f,一個(gè)list,但行為和 map不同:reduce傳入的函數(shù) f ,必須接收兩個(gè)參數(shù),reduce對(duì)list的每個(gè)元素反復(fù)調(diào)用函數(shù)f,并返回最終結(jié)果值。

例如,編寫(xiě)一個(gè)f函數(shù),接收x和y,返回x和y的和:

def f(x, y): return x + y

調(diào)用 reduce(f, [1, 3, 5, 7, 9])時(shí),reduce函數(shù)將做如下計(jì)算: 先計(jì)算頭兩個(gè)元素:f(1, 3),結(jié)果為4; 再把結(jié)果和第3個(gè)元素計(jì)算:f(4, 5),結(jié)果為9; 再把結(jié)果和第4個(gè)元素計(jì)算:f(9, 7),結(jié)果為16; 再把結(jié)果和第5個(gè)元素計(jì)算:f(16, 9),結(jié)果為25; 由于沒(méi)有更多的元素了,計(jì)算結(jié)束,返回結(jié)果25。

上述計(jì)算實(shí)際上是對(duì)list的所有元素求和。雖然Python內(nèi)置了求和函數(shù)sum(),但是利用reduce求和也很簡(jiǎn)單。

reduce還可以接收第3個(gè)可選參數(shù),作為計(jì)算的初始值。 如果把初始值設(shè)為100,計(jì)算:

reduce(f, [1, 3, 5, 7, 9], 100)

結(jié)果將變?yōu)?25,因?yàn)榈谝惠営?jì)算是:計(jì)算初始值和第一個(gè)元素:f(100, 1),結(jié)果為101。

四、filter函數(shù) filter函數(shù)可以對(duì)序列做過(guò)濾處理,就是說(shuō)可以使用一個(gè)自定義的函數(shù)過(guò)濾一個(gè)序列,把序列的每一項(xiàng)傳到自定義的過(guò)濾函數(shù)里處理,并返回結(jié)果做過(guò)濾。最終一次性返回過(guò)濾后的結(jié)果。 和map類(lèi)似,filter也接收一個(gè)函數(shù)和一個(gè)序列。和map不同的時(shí),filter把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。

語(yǔ)法

filter(func, seq)

例子

l = [100, 20, 24, 50, 110]new = list(filter(lambda x: x<50, l)) #py3得套個(gè)list來(lái)轉(zhuǎn)化,便于打印出來(lái)print(new)

熟練運(yùn)用以上三個(gè)玩意兒,你就可以一行寫(xiě)出幾乎所有的復(fù)雜計(jì)算了。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 隆德县| 江永县| 元朗区| 樟树市| 富宁县| 东宁县| 沁源县| 海原县| 隆昌县| 闸北区| 岐山县| 扬州市| 鹤庆县| 化州市| 清涧县| 玉龙| 长泰县| 太谷县| 安远县| 海宁市| 慈利县| 太康县| 天峨县| 吴旗县| 宜川县| 台前县| 扎鲁特旗| 迭部县| 通山县| 孝感市| 邳州市| 雷州市| 寻甸| 沛县| 嵊州市| 玉环县| 桐乡市| 漾濞| 三亚市| 安丘市| 盘锦市|