Python 提供了非常多的庫(kù)和內(nèi)置函數(shù)。有不同的方法可以執(zhí)行相同的任務(wù),而在 Python 中使用最為頻繁函數(shù)莫過(guò)于:lambda()、 map()、filter() 和 reduce() 函數(shù),今天我將和大家一起研究學(xué)習(xí),喜歡記得收藏、關(guān)注、點(diǎn)贊。 【注】代碼、資料、交流文末獲取 Lambda 函數(shù)簡(jiǎn)介Lambda函數(shù)也被稱為匿名(沒(méi)有名稱)函數(shù),它直接接受參數(shù)的數(shù)量以及使用該參數(shù)執(zhí)行的條件或操作,該參數(shù)以冒號(hào)分隔,并返回最終結(jié)果。為了在大型代碼庫(kù)上編寫(xiě)代碼時(shí)執(zhí)行一項(xiàng)小任務(wù),或者在函數(shù)中執(zhí)行一項(xiàng)小任務(wù),便在正常過(guò)程中使用lambda函數(shù)。
普通函數(shù)和Lambda函數(shù)的區(qū)別
為什么要使用Lambda函數(shù)?一般情況下,我們不使用Lambda函數(shù),而是將其與高階函數(shù)一起使用。高階函數(shù)是一種需要多個(gè)函數(shù)來(lái)完成任務(wù)的函數(shù),或者當(dāng)一個(gè)函數(shù)返回任何另一個(gè)函數(shù)時(shí),可以選擇使用Lambda函數(shù)。 什么是高階函數(shù)?通過(guò)一個(gè)例子來(lái)理解高階函數(shù)。假設(shè)有一個(gè)整數(shù)列表,必須返回三個(gè)輸出。
首先假設(shè)用普通函數(shù)來(lái)處理這個(gè)問(wèn)題。在這種情況下,將聲明三個(gè)不同的變量來(lái)存儲(chǔ)各個(gè)任務(wù),并使用一個(gè)for循環(huán)處理并返回結(jié)果三個(gè)變量。該方法常規(guī)可正常運(yùn)行。 現(xiàn)在使用Lambda函數(shù)來(lái)解決這個(gè)問(wèn)題,那么可以用三個(gè)不同的Lambda函數(shù)來(lái)檢查一個(gè)待檢驗(yàn)數(shù)是否是偶數(shù),奇數(shù),還是能被三整除,然后在結(jié)果中加上一個(gè)數(shù)。
這里創(chuàng)建了一個(gè)高階函數(shù),其中將Lambda函數(shù)作為一個(gè)部分傳遞給普通函數(shù)。其實(shí)這種類型的代碼在互聯(lián)網(wǎng)上隨處可見(jiàn)。然而很多人在使用Python時(shí)都會(huì)忽略這個(gè)函數(shù),或者只是偶爾使用它,但其實(shí)這些函數(shù)真的非常方便,同時(shí)也可以節(jié)省更多的代碼行。接下來(lái)我們一起看看這些高階函數(shù)。 Python內(nèi)置高階函數(shù)Map函數(shù)map() 會(huì)根據(jù)提供的函數(shù)對(duì)指定序列做映射。 Map函數(shù)是一個(gè)接受兩個(gè)參數(shù)的函數(shù)。第一個(gè)參數(shù) function 以參數(shù)序列中的每一個(gè)元素調(diào)用 function 函數(shù),第二個(gè)是任何可迭代的序列數(shù)據(jù)類型。返回包含每次 function 函數(shù)返回值的新列表。
Map函數(shù)將定義在迭代器對(duì)象中的某種類型的操作。假設(shè)我們要將數(shù)組元素進(jìn)行平方運(yùn)算,即將一個(gè)數(shù)組的每個(gè)元素的平方映射到另一個(gè)產(chǎn)生所需結(jié)果的數(shù)組。
我們可以以不同的方式使用Map函數(shù)。假設(shè)有一個(gè)包含名稱、地址等詳細(xì)信息的字典列表,目標(biāo)是生成一個(gè)包含所有名稱的新列表。
上述操作通常出現(xiàn)在從數(shù)據(jù)庫(kù)或網(wǎng)絡(luò)抓取獲取數(shù)據(jù)等場(chǎng)景中。 Filter函數(shù)Filter函數(shù)根據(jù)給定的特定條件過(guò)濾掉數(shù)據(jù)。即在函數(shù)中設(shè)定過(guò)濾條件,迭代元素,保留返回值為T(mén)rue 的元素。Map 函數(shù)對(duì)每個(gè)元素進(jìn)行操作,而 filter 函數(shù)僅輸出滿足特定要求的元素。 假設(shè)有一個(gè)水果名稱列表,任務(wù)是只輸出那些名稱中包含字符
filter(function or None, iterable) --> filter object 返回一個(gè)迭代器,為那些函數(shù)或項(xiàng)為真的可迭代項(xiàng)。如果函數(shù)為None,則返回為真的項(xiàng)。 Reduce函數(shù)這個(gè)函數(shù)比較特別,不是 Python 的內(nèi)置函數(shù),需要通過(guò)
將包含兩個(gè)參數(shù)的函數(shù)( 如果存在 假設(shè)有一個(gè)整數(shù)列表,并求得所有元素的總和。且使用reduce函數(shù)而不是使用for循環(huán)來(lái)處理此問(wèn)題。
還可以使用 reduce 函數(shù)而不是for循環(huán)從列表中找到最大或最小的元素。
高階函數(shù)的替代方法列表推導(dǎo)式其實(shí)列表推導(dǎo)式只是一個(gè)for循環(huán),用于添加新列表中的每一項(xiàng),以從現(xiàn)有索引或一組元素創(chuàng)建一個(gè)新列表。之前使用map、filter和reduce完成的工作也可以使用列表推導(dǎo)式完成。然而,相比于使用Map和filter函數(shù),很多人更喜歡使用列表推導(dǎo)式,也許是因?yàn)樗菀讘?yīng)用和記憶。 同樣使用列表推導(dǎo)式將數(shù)組中每個(gè)元素進(jìn)行平方運(yùn)算,水果的例子也可以使用列表推導(dǎo)式來(lái)解決。
字典推導(dǎo)式與列表推導(dǎo)式一樣,使用字典推導(dǎo)式從現(xiàn)有的字典創(chuàng)建一個(gè)新字典。還可以從列表創(chuàng)建字典。 假設(shè)有一個(gè)整數(shù)列表,需要?jiǎng)?chuàng)建一個(gè)字典,其中鍵是列表中的每個(gè)元素,值是列表中的每個(gè)元素的平方。
一個(gè)簡(jiǎn)單應(yīng)用如何快速找到多個(gè)字典的公共鍵方法一
例
解析
方法二
寫(xiě)在最后目前已經(jīng)學(xué)習(xí)了Lambda函數(shù)是什么,以及Lambda函數(shù)的一些使用方法。隨后又一起學(xué)習(xí)了Python中的高階函數(shù),以及如何在高階函數(shù)中使用lambda函數(shù)。除此之外,還學(xué)習(xí)了高階函數(shù)的替代方法:在列表推導(dǎo)式和字典推導(dǎo)式中執(zhí)行之前操作。雖然這些方法看似簡(jiǎn)單,或者說(shuō)你之前已經(jīng)見(jiàn)到過(guò)這類方法,但你很可能很少使用它們。你可以嘗試在其他更加復(fù)雜的函數(shù)中使用它們,以便使代碼更加簡(jiǎn)潔。 |
|