從Map和Reduce說起

2021-04-07 08:56:36 字數 1589 閱讀 3390

從map和reduce說起 最近在看函式式程式設計的一些東西,尤其是sheme和python,有些困惑,遂寫下一些東西。 在python中,map/reduce/filter是函式式程式設計的一組重要的工具. map將過程(函式)應用於資料以產生新的資料,而reduce則是將資料進行歸併. 下面的語句分別完成將list中每個元素平方的功能和對list求和的功能:

>>> map(lambda x: x*x,[1,2,3,4,5]) [1, 4, 9, 16, 25] >>> reduce((lambda x,y:x+y),[1,2,3,4,5]) 15 map將過程x*x應用於list中的每個元素,並產生新的list作為返回值,而reduce每次將 list中當前元素與上次應用過程的結果作為輸入應用到過程中. 看乙個複雜的例子,用於求前10個fibobacci數:

map(lambda x,f=lambda x,f:(x<=1) or (f(x-1,f)+f(x-2,f)): f(x,f),range(10)) map與reduce在scheme/lisp中就已經流行,scheme中的map實現為:

(define (map proc items)

(if (null? items) (list )

(cons (proc (car items)) (map proc (cdr items)))))

(define (reduce proc items) (if (null? items) 0

(proc (car items) (reduce proc (cdr items))))) 根據上面的map/reduce的定義,下面的表示式用於求1-5的平方和

(reduce (lambda (x y) (+ x y)) (map (lambda(x) (* x x)) (list 1 2 3 4 5))) 通過map和reduce建立了一種處理表的高層抽象.與命令式語言相比,scheme等函式式語言將處理資料的邏輯與提取元素的細節隔離開。(from: sicp) 在c/c++中也可以用函式指標來實現函式式程式設計的概念,但是由於語言特性的不支援,所以**相當的晦澀,遠不如python中的優雅自然.

#include

typedef int(*function)(int);

typedef int(*reducefunc)(int,int);

int square(int i)

int multiply(int i)

int add(int i, int j)

int map(function func,int* list,int len)

{ for(int i=0;i gooogle的工程師們根據map/reduce的思想,實現了一種分布式排程演算法mapreduce,其核心是利用乙個map操作以key/value對作為輸入,並且產生一組中間key/value集合。reduce方法接收乙個中間的鍵i和一組關於該鍵的值,然後將該將這些值合併成一組更小的集合.

map 函式和reduce 函式

map 函式 也稱對映物件函式,接受兩個引數,第乙個是函式,第二個是序列。map 將傳入的函式依次作用到序列的每個元素並把結果作為list返回。map返回的結果是乙個可迭代的map物件,可以使用 next 獲取值,也可使用for迴圈迭代獲取或者直接轉換為list獲取更加暴力。def demo x r...

map和reduce函式簡介

map函式會根據提供的函式對指定序列做對映。其語法為 map function,iterable 也就是對iterable中的每乙個元素進行function的運算,並返回乙個迭代器。我們想要實現這樣乙個目的 判斷乙個數是奇數還是偶數,並返回乙個列表,列表中包含判斷結果。首先我們定義乙個函式用於判斷並...

map 函式和 reduce 函式

從引數方面來講 map 包含兩個引數,第乙個引數是乙個函式,第二個是序列 列表 或元組 其中,函式 即 map 的第乙個引數位置的函式 可以接收乙個或多個引數。reduce 第乙個引數是函式,第二個是序列 列表或元組 但是,其函式必須接收兩個引數。從對傳進去的數值作用來講 map 是將傳入的函式依次...