天天看點

python 高階函數 map reduce filter sorted 閉包 裝飾器

高階函數英文叫Higher-order function

1.map

map(func, seq,seq.....)

例如: map(lambda x,y:x+y, range(0, 10), range(0, 10))

相當于: map(lambda x, x*2, range(0, 10))

結果:[0, 2, 4, 6, 8....]

用map實作0,100的加法,就顯得力不從心了,不過用下面的方法,簡單許多。

2.reduce

reduce(func, seq, init)

其中:func 為二進制參數的函數,seq 為序列, init是初始值, 每次擷取的兩個元素為:上次結果 +此次去除元素

例如:reduce(lambda x,y: x+y, range(0, 101), 0)

結果:5050

特性:取上次結果作為參數

map雖然可以同時周遊兩個序列,但是兩個序列長度不同的時候,就不太‘優雅’了,此時zip 來了

3.zip

zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

例如:zip(l1, l2, l3) (l1 = range(0, 10), l2=range(1, 10, 2), l3=range(0, 10, 2))

特性:zip 可以将不同長度的序列,以最短的序列為标準,構造成元組清單,元組元素來自于各個序列

是以:在使用map進行操作的時候,如果是多個序列,可以先通過zip‘統一化’,然後由函數處理

4.filter

filter(bool_func, seq)

例如: filter(lambda x: x%2 == 0, range(0, 11))

結果:[0, 2, 4, 6, 8, 10]

特性:隻有兩個參數,一個是傳回值為bool類型的函數, 另外一個是待過濾的序列

filter 的參數函數傳回的為bool型的, 下面的sorted的函數也大同小異

5.sorted 

sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

第一個是可疊代對象,cmp為比較函數,傳回0, 1, -1

key用來指定比較關鍵字,預設為第一項,若是每個元素有多項内容,可以在這裡指定

reverse,bool值表示是否逆置

例如:

def reversed_cmp(x, y):
    	if x > y:
        	return -1
    	if x < y:
        	return 1
    	return 0
	l = [random.randint(0, 100) for i in range(10)]
	sorted(l, reversed_cmp)

	結果:[85, 73, 68, 51, 46, 35, 29, 24, 8, 0]
           

5.閉包

閉包是指可以包含自由(未綁定到特定對象)變量的代碼塊;

這些變量不是在這個代碼塊内或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變量)。

“閉包” 一詞來源于以下兩者的結合:要執行的代碼塊(由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)

  和為自由變量提供綁定的計算環境(作用域)

python 中支援傳回值為函數

此時隻要是稍加改變就形成了“閉包”

python中實作方法:

函數中内定義函數,内部定義的函數引用了來自外部函數的值,外部函數傳回值為内部定義的函數

def lazy_sum(*args):

    def sum():

        ax = 0

        for n in args:

            ax = ax + n

        return ax

    return sum

當隻是對外部函數調用,會獲得一的傳回的函數,此函數持有外部函數變量

注意:被内部函數引用的變量 盡量不要變化,否則,會出現想不到的結果 g

6.裝飾器

簡單日志裝飾器 g

log(func):

def wrapper(*args, **kwargs):

print " call %s " % func.__name__   # 注意func.__name__ 為函數,或者對象名

func(*args, **kwargs)

return wrapper

使用:

@log

def now()

print “123”

now()

結果:call now 

   123

基本原理:

執行的時候,先調用裝飾函數,然後裝飾函數内部進行真實函數的調用

此時 now =log(now)

簡單的說裝飾器,就是為了在原有功能(代碼不修改)基礎上,添加新的功能,進行裝飾

詳細的,如果帶有參數,隻需在裝飾器外加一層處理參數的代碼即可

def log(text):

    def decorator(func):

        def wrapper(*args, **kw):

            print '%s %s():' % (text, func.__name__)

            return func(*args, **kw)

      return wrapper

  return decorator

此時 :now = log('execute')(now)

g

注意,此處就用到了閉包哦

python 高階函數 map reduce filter sorted 閉包 裝飾器