Python進階筆記(1)_ 函數式編程 之 高階函數

Python 入門筆記是我從 IMOOC 上學習之後做的小結。初始目的當然是爲了再複習一遍,以及保存。同時,若能讓更多的初學者受一點點的益處,那我也會感到欣慰。

我學python的最終目的是用其做圖像處理應用。就目前的學習程度遠不能達到此目的,所以,繼續進階學習是很有必要的。

處於此目的,我邊學習,邊做博客筆記。


首先我們學習 函數式編程。學習內容主要包括高階函數、閉包和裝飾器。本節(One)學習高階函數,下一節(Two)學習閉包和裝飾器。


高階函數

高階函數就是指其參數也可以是函數的函數。

來看看如下兩個例子:

f = len
print f([-20,5,12]) 

len = range
print len(2,8,2)
上面的輸出分別爲 3 和 [2, 4, 6, 8]。所以,在python 裏,變量可以指向一個函數,而且函數名其實是指向函數的變量。

再來看一個更生動的例子,把函數作爲了參數:

import math

def add(x, y, func):
    return func(x) + func(y)

print add(16, -4, abs)
print add(25, 16, math.sqrt)
此時輸出分別爲 20 和 9。


map( ) 函數

map()是 Python 內置的高階函數,它接收一個函數 f 和一個 list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。

def format_str(s):
    return s[0].upper() + s[1:].lower()

print map(format_str, ['pHoEnix', 'trEE', 'SKY'])
輸出爲 ['Phoenix', 'Tree', 'Sky']。


reduce( ) 函數

reduce 不同於 map 的是,首先它必須有兩個輸入參數,其次它是將 list 前面的元素按照 f 函數運算後的結果,與下一個元素繼續按照 f 函數計算。

如果 reduce 含有第三個元素,這個元素就是整個計算的初始值。

def add(x, y):
    return x+y

print reduce(add), [2,4,6,8,10])


filter( ) 函數

filter 需要一個 f 函數和 list 作爲輸入參數,其中函數 f  的作用是對每個元素進行判斷,返回 True或 False,filter() 根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新 list。直接來看例子:

用filter 濾出百位數和個位數相同的所有三位整數。

def is_xYx(num):
    if num/100 == num%10:
        return num
        
print filter(is_xYx, range(100,1000))


sorted( ) 函數

sorted 函數可對 list 按照參數 f (x, y) 函數的定義進行新的排序。也就是說,f 是一個比較函數,而且要求若 x 應該在 y 之前時,f 輸出爲 1;若 x 應該在 y 之後時,f 輸出爲 -1;x 和 y 相等時,輸出爲 0。

我們來看一段實現忽略大小寫排序的算法。

def cmp_ignore_case(s1, s2):
    if s1[0].lower() < s2[0].lower():
        return -1
    if s1[0].lower() > s2[0].lower():
        return 1
    return 0
print sorted(['phoenix', 'Tree', 'sky', 'Rui','feng'], cmp_ignore_case)
輸出爲 ['feng', 'phoenix', 'Rui', 'sky', 'Tree']





















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