高階函數英文叫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
注意,此處就用到了閉包哦