python-用Map, Filter, Reduce代替For循环
for 循環(huán)就像是一把瑞士軍刀,它可以解決很多問題,但是,當你需要掃視代碼,快速搞清楚代碼所做的事情時,它們可能會讓人不知所措。
map、filter 和 reduce 這三種技術(shù)可以提供描述迭代原因的函數(shù)替代方案,以便避免過多的 for 循環(huán)。
劃重點:迭代
?什么是 Map、Filter 和 Reduce?
在寫代碼時 95% 的時間都花在遍歷字符串或數(shù)組上。在這種情況下,一般會執(zhí)行以下操作之一:將一系列語句映射到每個值,篩選滿足特定條件的值,或?qū)?shù)據(jù)集減少為單個聚合值。
其實循環(huán)遍歷通常屬于這三種功能類別之一:
-
Map:對每個項應(yīng)用相同的步驟集,存儲結(jié)果
-
Filter:應(yīng)用驗證條件,存儲計算結(jié)果為 True 的項
-
Reduce:返回一個從元素傳遞到元素的值
?Python中的 Map/Filter/Reduce?
在 Python 中,這三種技術(shù)作為函數(shù)存在,而不是數(shù)組或字符串類的方法。這意味著,得編寫 map(function, my_list),而不是編寫 my_array.map(function)。
此外,每個技術(shù)都需要傳遞一個函數(shù),該函數(shù)將執(zhí)行每個項目。通常,該函數(shù)是作為匿名函數(shù)(在 JavaScript 中稱為 arrow 頭函數(shù))編寫的。但是,在 Python 中,經(jīng)常看到被使用的是 lambda 表達式。
lambda 表達式和 arrow 函數(shù)之間的語法實際上非常相似。將 => 替換為 :?并確保使用關(guān)鍵字 lambda,其余的幾乎相同。
// Python Lambda Expressionsquare = lambda number: number * numberarrow 函數(shù)和 lambda 表達式之間的一個關(guān)鍵區(qū)別是,arrow 函數(shù)能夠通過多個語句擴展成完整的函數(shù),而 lambda 表達式僅限于返回的單個表達式。因此,在使用 map()、filter()或 reduce()時,如果需要對每個項執(zhí)行多個操作,請先定義函數(shù),然后再包含它。
def inefficientSquare(number): result = number * number return result map(inefficientSquare, my_list)替換 for 循環(huán)
下面是三個常見的 for 循環(huán)示例,它們將被 map、filter 和 reduce 替換。目標:計算列表中奇數(shù)平方和。
首先,使用 基本的 for 循環(huán)示例。注意:下面的代碼純粹是為了演示,即使沒有 map/filter/reduce 也有改進空間。
numbers = [1,2,3,4,5,6]odd_numbers = []squared_odd_numbers = []total = 0 # filter for odd numbersfor number in numbers: if number % 2 == 1: odd_numbers.append(number) # square all odd numbersfor number in odd_numbers: squared_odd_numbers.append(number * number) # calculate totalfor number in squared_odd_numbers:??total?+=?number # calculate average將每個步驟轉(zhuǎn)換為這三個函數(shù)的其中之一:
from functools import reducenumbers = [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)有幾個重要的語法要點要強調(diào)。
-
map()和 filter()本機可用。但是,reduce()必須從 Python 3 以上版本中的函數(shù)庫導入
-
lambda 表達式是所有三個函數(shù)中的第一個參數(shù),iterable 是第二個參數(shù)
-
reduce()的 lambda 表達式需要兩個參數(shù):累加器(傳遞給每個元素的值)和單個元素本身
via:https://medium.com/better-programming/how-to-replace-your-python-for-loops-with-map-filter-and-reduce-c1b5fa96f43a
總結(jié)
以上是生活随笔為你收集整理的python-用Map, Filter, Reduce代替For循环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 标准差Std() 参数决定
- 下一篇: OSM OpenStreetMap 获取