那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python中 Map/Filter/Reduce的差異

454398 ? 來源:AI公園 ? 作者:Jonathan Hsu ? 2020-11-17 14:37 ? 次閱讀

作者:Jonathan Hsu
編譯:ronghuaiyang

導讀

想不想去掉瀑布一樣的For循環?使用函數式編程來寫代碼。

你有沒有過看自己的代碼的時候,看到瀑布一樣的 for 循環?你是否發現自己不得不瞇著眼睛,向顯示器前傾才能看得更清楚?

我知道我有過。

For 循環是解決問題的瑞士軍刀,但是,當需要瀏覽代碼以快速閱讀你所做的事情時,它們可能會讓人不知所措。

有三種技術 — map、filter 和 reduce — 可以通過描述如何進行迭代來代替 for 訓練。JavaScript 中也有這些技術,但是在 Python 中的實現略有不同。

我們將簡要介紹這三種技術中的每一種,強調它們在 JavaScript 和 Python 中的語法差異,然后給出如何轉換普通 for 循環的示例。

什么是 Map, Filter, 以及 Reduce?

回顧之前寫的代碼,我發現在 95%的情況下,當循環遍歷字符串或數組時,我是這樣做的:將序列map到每個值,filter滿足特定條件的值,或者將數據集reduce到單個聚合值。

有了這樣的認識,這三種方法就是識別 —— 然后實現,你遍歷 iterable 的原因通常屬于這三種功能中的一種:

Map:對每個一項應用相同步驟的操作,然后存儲結果。

Filter:應用驗證標準,存儲評估為真的項。

Reduce:返回一個在元素之間傳遞的值。

Python 中 Map/Filter/Reduce 的不同點是什么?

在 Python 中,這三種技術以函數的形式存在,而不是以數組或字符串類的方法。這意味著不要寫成my_array.map(function),而要寫成map(function, my_list)。

此外,每種技術都需要傳遞一個函數,該函數將為每個一項執行。通常,函數被寫成匿名函數(在 JavaScript 中稱為胖箭頭函數)。但是,在 Python 中經??吹绞褂?lambda 表達式。

lambda 表達式和箭頭函數之間的語法實際上非常相似。將' => '替換為':',并確保使用關鍵字' lambda ',其余內容幾乎相同。

// JavaScript Arrow Function
const square = number => number * number;
// Python Lambda Expression
square = lambda number: number * number

箭頭函數和 lambda 表達式之間的一個關鍵區別是,箭頭函數可以擴展成包含多條語句的完整函數,而 lambda 表達式則被限制為返回的單個表達式。因此,在使用map()、filter()或reduce() 的時候,如果你需要對每個項執行多個操作,那么首先定義函數,然后將其包含進來。

def inefficientSquare(number):
   result = number * number
   return result
map(inefficientSquare, my_list)

替換 For 循環

好吧,說正事。下面是三個常見的 for 循環示例,它們將被 map、filter 和 reduce 替換。我們的編程提示:計算列表中奇數的平方和。

首先,使用 basic for 循環的例子。注意:這純粹是為了演示,甚至可以在沒有 map/filter/reduce 的情況下進行改進。

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

讓我們把每一步轉換為一個函數:

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)

有幾個重要的語法點需要突出顯示。

map()和filter()是本地可用的。但是,reduce()必須從 Python 3+的functools庫中導入。

lmbda 表達式是所有三個函數中的第一個參數,而 iterable 是第二個參數

reduce()的 lambda 表達式需要兩個參數:累加器(傳遞給每個元素的值)和單個元素本身。

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 顯示器
    +關注

    關注

    21

    文章

    5010

    瀏覽量

    140407
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    85039
收藏 人收藏

    評論

    相關推薦

    python:利用mapreduce編寫一個str2float函數,把字符串'.1'轉換成浮點數0.1:

    #!/usr/bin/env python3# -*- coding: utf-8 -*-from functools import reduceCHAR_TO_FLOAT = { '0': 0
    發表于 07-16 01:27

    python初學--用map規范英文名字

    進入第3天學習,接觸到第一個練習,利用 map() 函數,把用戶輸入的不規范的英文名字,變為首字母大寫,其他小寫的規范名字。輸入: ['adam', 'LISA', 'barT'] ,輸出
    發表于 12-25 14:47

    python高階函數

    注意的是,以上示例是在 Python2.x 環境下演示的。而在 Python3.x ,卻有所不同,你可以自己嘗試一下。這里總結一下:第一點,map
    發表于 03-02 16:47

    紋理映射技術Mip_Map的研究_曾云

    紋理映射技術Mip_Map的研究_曾云
    發表于 03-15 11:08 ?0次下載

    Python的三種函數應用及代碼

    1.filter的用法 函數filter(function,list)提供一種優雅的方式過濾出列表函數值返回為True的函數,函數filter(f,l)需要一個函數f作為第一個參數,
    發表于 11-15 13:07 ?1369次閱讀
    <b class='flag-5'>Python</b>的三種函數應用及代碼

    Reduce階段values的每個值都共享一個對象

    Hadoop備忘:Reduce階段IterableVALUEIN values的每個都共享一個對象。在Reduce階段,具有相同key的的所有的value都會被組織到一起,形成一種key:values的形式。
    發表于 11-28 11:00 ?1383次閱讀

    mapreduce MAP進程的數量怎么控制?

    1.如果想增加map個數,則設置mapred.map.tasks 為一個較大的值2.如果想減小map個數,則設置mapred.min.split.size 為一個較大的值3.如果輸入中有很多小文件,依然想減少
    發表于 01-02 14:04 ?1916次閱讀
    mapreduce <b class='flag-5'>中</b><b class='flag-5'>MAP</b>進程的數量怎么控制?

    Mapreduce和Hivemap reduce個數設定

    Mapreducemapper個數的確定: 在map階段讀取數據前,FileInputFormat會將輸入文件分割成split。split的個數決定了map的個數。 影響map個數,
    發表于 01-02 14:21 ?6140次閱讀

    mapreduce工作原理圖文詳解_Map、Reduce任務Shuffle和排序

    本文主要分析以下兩點內容:1.MapReduce作業運行流程原理2.MapReduce任務Shuffle和排序的過程。分析如下文
    發表于 01-02 14:39 ?8591次閱讀
    mapreduce工作原理圖文詳解_<b class='flag-5'>Map</b>、<b class='flag-5'>Reduce</b>任務<b class='flag-5'>中</b>Shuffle和排序

    MDK- ARMmap文件全解析

    MDK-ARMmap文件全解析
    的頭像 發表于 03-14 14:00 ?6149次閱讀
    MDK- ARM<b class='flag-5'>中</b><b class='flag-5'>map</b>文件全解析

    python高階函數詳解

    python高階函數 1. map 函數 map 函數,它接收兩個參數,第一個參數是一個函數對象(當然也可以是一個lambda表達式),第二個參數是一個序列。 它可以實現怎樣的功能呢,我舉個例子你
    的頭像 發表于 03-02 16:47 ?1328次閱讀
    <b class='flag-5'>python</b>高階函數詳解

    Python 和 MicroPython 之間的差異

    Python 和 MicroPython 之間的差異
    的頭像 發表于 12-28 09:51 ?3790次閱讀

    NIVDIA的reduce優化筆記

    通俗的來說,Reduce就是要對一個數組求 sum,min,max,avg 等等。Reduce又被叫作規約,意思就是遞歸約減,最后獲得的輸出相比于輸入一般維度上會遞減。
    的頭像 發表于 01-12 15:05 ?779次閱讀

    Ruby 與 Python之間的差異

    Ruby 與 Python 之間的差異在很大程度上可通過 for 循環看出本質。 Python 擁有 for 語句。對象告訴 for 如何進行協作,而 for 的循環體會處理對象返回的內容
    的頭像 發表于 10-30 11:50 ?676次閱讀

    Python2與Python3的差異

    Python2與Python3是兩個不同的版本,它們在語法、功能和性能等方面存在一些差異。下面是對Python2和Python3的詳盡、詳實
    的頭像 發表于 11-23 16:48 ?1095次閱讀
    百家乐闲拉长龙| 悍马百家乐官网的玩法技巧和规则 | 大发888打法888| 加多宝百家乐官网的玩法技巧和规则 | 百家乐庄89| 百家乐官网庄家闲| 文登市| 棋牌室高尔夫娱乐场| 菲律宾百家乐赌场娱乐网规则| KK百家乐官网的玩法技巧和规则 | 百家乐那个娱乐城信誉好| 金百亿百家乐娱乐城| 百家乐官网真人玩下载| 永济市| 瑞丰娱乐城| 网上百家乐有人赢过嘛 | 皇冠网开户| 大发888-娱乐| 大家旺百家乐的玩法技巧和规则| 百家乐官网庄闲桌| 百家乐官网一拖三| 百家乐官网玩法说明| 棋牌评测网| 百家乐平注法口诀技巧| 如何玩百家乐赢钱技巧| 百家乐全自动分析软件| 百家乐赢法口诀| 大集汇百家乐官网的玩法技巧和规则 | 网上足球投注| 大发888 casino官网| 威尼斯人娱乐城可信吗| 金赞百家乐的玩法技巧和规则| 百家乐网络赌博真假| 百家乐博彩安全吗| 美高梅百家乐娱乐城| 属猪的人做生意摆放什么聚财| 百家乐官网视频画面| 赌百家乐官网的计划跟策略| 玩百家乐官网的高手| 送58百家乐官网的玩法技巧和规则 | bet365怎么样|