python學習筆記(九)函數式進階:使用map、reduce、filter、sorted

在第三節中簡單學習了函數式的概念,這裏通過運用幾個常用的高階函數來熟悉函數式編程方法,在文末給出一個綜合性例子。

開始

這四個高階函數具有相似的參數結構,都是以其中一個參數爲列表,另一個參數爲函數。不同的是它們的功能。

map

map的作用簡單來說是將列表中各個元素冠以函數頭。即將函數映射作用到每一個元素上.(格式:map(函數,列表))

def mp(a):
    print a
    return a
l = [1,2,3,4]
map(mp,l)

在這個過程中產生了副作用:打印元素值,在純函數式編程中是沒有這類副作用的。

reduce

如果說map是把每個元素戴上函數的帽子,那麼reduce就是將列表的頭直接換成函數頭。
列表結構類似於一個鏈表,每一個結點包含當前元素值以及之後元素的指針,且每個結點有一個“列表頭”,因此對其進行reduce操作相當於一個遞歸函數。
傳入的函數必須滿足其參數性質爲:第一個參數爲之後的結點計算得出的元素值,第二個參數爲當前的結點(可能爲空)。
格式:reduce(函數,列表)
reduce(f,[1,2,3,4]) => f(f(f(1,2),3),4)

inorder = [3,2,4,1,6,5,7]

def func(other,cur):
    print other,cur
    return cur
reduce(func,inorder)

filter

filter作用是將滿足函數條件的元素全部濾除。因此傳入的函數必須爲返回true或false的函數。

inorder = filter(lambda(a):a>5,inorder)

sorted

sorted作用是按照函數規則進行排序。函數規則是:返回-1代表二者是逆序關係,返回1代表二者是順序關係,返回0代表二者等序。
具體實現見例子。

一個例子

import math
import functools

class item(object):
    def __init__(self,x,y):
        self.__x = x
        self.__y = y
    @property
    def x(self):
        return self.__x
    @x.setter
    def x(self,value):
        self.__x = value

    @property
    def y(self):
        return self.__y
    @y.setter
    def y(self,value):
        self.__y = value

    @property
    def power(self):
        return math.sqrt(self.__x*self.__x+self.__y*self.__y)


def func_sort_with(member):
    def item_compare(a,b):
        i1 = eval('a.'+member)
        i2 = eval('b.'+member)
        if i1>i2:
            return -1
        elif i2>i1:
            return 1
        return 0
    return functools.partial(sorted,cmp = item_compare)

def print_name(it):
    print str(it.x)

list_src = [item(i,10-i) for i in range(1,10)]
f1 = func_sort_with('x')
list_1 = f1(list_src)
print 'sort with x:'
map(print_name,list_1)

f2 = func_sort_with('power')
list_2 = f2(list_src)
print 'sort with power'
map(print_name,list_2)

其中f1、f2是用閉包得到的函數,可以根據傳入的參數選擇類的成員作爲其排序依據進行排序;eval()是可以將字符串作爲python代碼執行的函數;使用map是一種簡便的遍歷列表的寫法。

參考資料:
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00141861202544241651579c69d4399a9aa135afef28c44000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章