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

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

3天內(nèi)不再提示

Python中 Map/Filter/Reduce的差異

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

作者:Jonathan Hsu
編譯:ronghuaiyang

導讀

想不想去掉瀑布一樣的For循環(huán)?使用函數(shù)式編程來寫代碼。

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

我知道我有過。

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

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

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

什么是 Map, Filter, 以及 Reduce?

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

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

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

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

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

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

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

此外,每種技術都需要傳遞一個函數(shù),該函數(shù)將為每個一項執(zhí)行。通常,函數(shù)被寫成匿名函數(shù)(在 JavaScript 中稱為胖箭頭函數(shù))。但是,在 Python 中經(jīng)常看到使用 lambda 表達式。

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

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

箭頭函數(shù)和 lambda 表達式之間的一個關鍵區(qū)別是,箭頭函數(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ù)的平方和。

首先,使用 basic for 循環(huán)的例子。注意:這純粹是為了演示,甚至可以在沒有 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

讓我們把每一步轉(zhuǎn)換為一個函數(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)

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

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

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

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

編輯:hfy

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

    關注

    21

    文章

    4980

    瀏覽量

    140045
  • python
    +關注

    關注

    56

    文章

    4797

    瀏覽量

    84729
收藏 人收藏

    評論

    相關推薦

    python:利用mapreduce編寫一個str2float函數(shù),把字符串'.1'轉(zhuǎn)換成浮點數(shù)0.1:

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

    python初學--用map規(guī)范英文名字

    進入第3天學習,接觸到第一個練習,利用 map() 函數(shù),把用戶輸入的不規(guī)范的英文名字,變?yōu)槭鬃帜复髮?,其他小寫的?guī)范名字。輸入: ['adam', 'LISA', 'barT'] ,輸出
    發(fā)表于 12-25 14:47

    python高階函數(shù)

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

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

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

    Python的三種函數(shù)應用及代碼

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

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

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

    mapreduce MAP進程的數(shù)量怎么控制?

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

    Mapreduce和Hivemap reduce個數(shù)設定

    Mapreducemapper個數(shù)的確定: 在map階段讀取數(shù)據(jù)前,F(xiàn)ileInputFormat會將輸入文件分割成split。split的個數(shù)決定了map的個數(shù)。 影響map個數(shù),
    發(fā)表于 01-02 14:21 ?6118次閱讀

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

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

    MDK- ARMmap文件全解析

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

    python高階函數(shù)詳解

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

    Python 和 MicroPython 之間的差異

    Python 和 MicroPython 之間的差異
    的頭像 發(fā)表于 12-28 09:51 ?3715次閱讀

    NIVDIA的reduce優(yōu)化筆記

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

    Ruby 與 Python之間的差異

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

    Python2與Python3的差異

    Python2與Python3是兩個不同的版本,它們在語法、功能和性能等方面存在一些差異。下面是對Python2和Python3的詳盡、詳實
    的頭像 發(fā)表于 11-23 16:48 ?1021次閱讀