又大又粗又猛免费视频久久_国产理论在线播放_久久男人av资源网站免费软件_99国产精品无码

Python編程技巧:如何用Map, Filter, Reduce代替For循環(huán)?(python map和filter)

Python編程技巧:如何用Map, Filter, Reduce代替For循環(huán)?(python map和filter)

你是否有過(guò)這樣的經(jīng)歷,你查看自己寫(xiě)的代碼并看到滿(mǎn)眼的 for 循環(huán)?你發(fā)現(xiàn)你必須斜著你的眼睛,并將腦袋前傾到你的顯示器,以看得更清楚。

反正我有過(guò)這樣的經(jīng)歷。

for 循環(huán)就像是一把瑞士軍刀,它可以解決很多問(wèn)題,但是,當(dāng)你需要掃視代碼,快速搞清楚代碼所做的事情時(shí),它們可能會(huì)讓人不知所措。

map、filter 和 reduce 這三種技術(shù)可以提供描述迭代原因的函數(shù)替代方案,以便避免過(guò)多的 for 循環(huán)。我之前在 JavaScript 中寫(xiě)過(guò)這些技術(shù)的入門(mén)文章,但是它們?cè)?Python 中的實(shí)現(xiàn)略有不同。

我們將簡(jiǎn)要介紹這三種技術(shù),主要介紹它們?cè)?JavaScript 和 Python 中的語(yǔ)法差異,然后給出如何轉(zhuǎn)換 for 循環(huán)的示例。

什么是 Map、Filter 和 Reduce?

回顧我以前編寫(xiě)的代碼,我意識(shí)到 95% 的時(shí)間都花在遍歷字符串或數(shù)組上。在這種情況下,我會(huì)執(zhí)行以下操作之一:將一系列語(yǔ)句映射到每個(gè)值,篩選滿(mǎn)足特定條件的值,或?qū)?shù)據(jù)集減少為單個(gè)聚合值。

有了這種洞察力,你就可以識(shí)別和實(shí)現(xiàn)這三種方法,即循環(huán)遍歷通常屬于這三種功能類(lèi)別之一:

  • Map:對(duì)每個(gè)項(xiàng)應(yīng)用相同的步驟集,存儲(chǔ)結(jié)果

  • Filter:應(yīng)用驗(yàn)證條件,存儲(chǔ)計(jì)算結(jié)果為 True 的項(xiàng)

  • Reduce:返回一個(gè)從元素傳遞到元素的值

為什么 Python Map/Filter/Reduce 會(huì)不一樣?

在 Python 中,這三種技術(shù)作為函數(shù)存在,而不是數(shù)組或字符串類(lèi)的方法。這意味著,你將編寫(xiě) map(function, my_list),而不是編寫(xiě) my_array.map(function)。

此外,每個(gè)技術(shù)都需要傳遞一個(gè)函數(shù),該函數(shù)將執(zhí)行每個(gè)項(xiàng)目。通常,該函數(shù)是作為匿名函數(shù)(在 JavaScript 中稱(chēng)為 arrow 頭函數(shù))編寫(xiě)的。但是,在 Python 中,你經(jīng)??吹奖皇褂玫氖?lambda 表達(dá)式。

lambda 表達(dá)式和 arrow 函數(shù)之間的語(yǔ)法實(shí)際上非常相似。將 => 替換為 : 并確保使用關(guān)鍵字 lambda,其余的幾乎相同。

// JavaScript Arrow Functionconst square = number => number * number;

// Python Lambda Expressionsquare = lambda number: number * number

arrow 函數(shù)和 lambda 表達(dá)式之間的一個(gè)關(guān)鍵區(qū)別是,arrow 函數(shù)能夠通過(guò)多個(gè)語(yǔ)句擴(kuò)展成完整的函數(shù),而 lambda 表達(dá)式僅限于返回的單個(gè)表達(dá)式。因此,在使用 map、filter或 reduce時(shí),如果需要對(duì)每個(gè)項(xiàng)執(zhí)行多個(gè)操作,請(qǐng)先定義函數(shù),然后再包含它。

def inefficientSquare(number):

result = number * number

return result

map(inefficientSquare, my_list)

替換 for 循環(huán)

好了,下面來(lái)點(diǎn)好東西。下面是三個(gè)常見(jiàn)的 for 循環(huán)示例,它們將被 map、filter 和 reduce 替換。我們的編程目標(biāo):計(jì)算列表中奇數(shù)平方和。

首先,使用 基本的 for 循環(huán)示例。注意:下面的代碼純粹是為了演示,即使沒(méi)有 map/filter/reduce 也有改進(jìn)空間。

numbers = [1,2,3,4,5,6]

odd_numbers =

squared_odd_numbers =

total = 0

# filter for odd numbers

for number in numbers:

if number % 2 == 1:

odd_numbers.append(number)

# square all odd numbers

for number in odd_numbers:

squared_odd_numbers.append(number * number)

# calculate total

for number in squared_odd_numbers:

total = number

# calculate average

讓我們將每個(gè)步驟轉(zhuǎn)換為這三個(gè)函數(shù)的其中之一:

from functools import reduce

numbers = [1,2,3,4,5,6]

odd_numbers = filter(lambda n: n % 2 == 1, numbers)

squared_odd_numbers = map(lambda n: n * n, odd_numbers)

total = reduce(lambda acc, n: acc n, squared_odd_numbers)

有幾個(gè)重要的語(yǔ)法要點(diǎn)要強(qiáng)調(diào)。

  • map和 filter本機(jī)可用。但是,reduce必須從 Python 3 以上版本中的函數(shù)庫(kù)導(dǎo)入

  • lambda 表達(dá)式是所有三個(gè)函數(shù)中的第一個(gè)參數(shù),iterable 是第二個(gè)參數(shù)

  • reduce的 lambda 表達(dá)式需要兩個(gè)參數(shù):累加器(傳遞給每個(gè)元素的值)和單個(gè)元素本身

記住,for 循環(huán)在代碼中確實(shí)是很重要的,但是擴(kuò)展工具包從來(lái)都不是壞事。

via:https://medium.com/better-programming/how-to-replace-your-python-for-loops-with-map-filter-and-reduce-c1b5fa96f43a

雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
在線咨詢(xún)
分享本頁(yè)
返回頂部