python中高阶函数和装饰器_三.Python高阶函数和装饰器
1高階函數
1.1 數學概念回顧下數學知識:
y=f(x) 這是最開始接觸的普通函數
y=g(f(x)) 這個就是我們接觸到的高階函數
在數學和計算機科學中,高階函數至少應當是滿足下面一個條件的函數:
1)接受一個或者多個函數作為參數
2)輸出一個函數
程序中我們的高階函數也類似
示例計數器的函數:def counter(base):
def inc(step=1):
nonlocal base
base += step
return base
return inc
1.2 內建函數應用高階函數舉例
sorte(iterable,key) 排序,返回一個列表
filter(function, iterable) 過濾可迭代對象的元素,返回一個迭代器
map(function, *iterable) -->map object 對多個可迭代對象的元素按照指定的函數進行映射,返回一個迭代器
2 裝飾器
2.1 自定義高階函數
2.1.1 柯里化Currying
自定義高階函數前,先了解下柯里化Currying:
柯里化:指的是將原來接受兩個參數的函數變成新的接收一個參數的函數,新的函數返回一個以原有第二個參數為參數的函數
z = f(x, y)轉換成z=f(x)(y)
通過嵌套函數就可以把函數轉換成柯里化函數
舉例def add(x,y):
return x+y
改變后def add(x):
def _add(y):
nonlocalt x
retrun x+y
return _add
這就是一個簡單的高階函數
2.2 高階函數應用--裝飾器
引入:
存在一個add函數。def add(x, y):
return x + y
這個add()太low了,我需要增強他的功能,譬如加入信息輸出功能:def add(x, y):
print("call add, {}+{}".format(x,y))
return x + y
上面的加法函數實現我的需求,但還是不夠好,存在以下缺點:
1)打印語句的耦合太高。
2)add()屬于業務功能,而輸出信息屬于非業務功能代碼,類似日志的東東,放在add()函數不太合適。
那么改進下:def add(x, y):
return x + y
def logger(fn):
print("開始業務執行")
x = fn(4, 5)
print("執行結束,結果:", x)
print(logger(add))
好了一些,那繼續改進def add(x,y):
return x+y
def logger(fn,x,y):
print("開始業務執行")
ret = fn(x,y)
print("執行結束",)
return ret
改進后,fn的參數仍受限制,只能針對含有兩個參數的add,我想讓logger適用的范圍更大一些,譬如我有一個sum(x,y,z)
繼續改進def logger(fn,*args,**kwargs):
print("開始業務執行")
ret = fn(*args,**kwargs)
print("執行結束")
return ret
這個時候,進行柯里化def logger(fn):
def _logger(*args, **kwargs):
print('before')
ret = fn(*args, **kwargs)
print('after')
return ret
return _logger
# 如下調用
add = logger(add) # 因為函數調用的關系,參數add的引用用在函數內部保存
add(4, 5) # 調用的是內部保存的add引用,而非原本的add函數
Python將其改進為裝飾器def logger(fn):
def _logger(*args, **kwargs):
print('before')
ret = fn(*args, **kwargs)
print('after')
return ret
return _logger
@logger
def add(x,y):
return x+y
print(add(4, 10))
裝飾器是高階函數一個重要應用,是對傳入函數的功能裝飾或者是功能增強。
總結
以上是生活随笔為你收集整理的python中高阶函数和装饰器_三.Python高阶函数和装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: pythonurllib微博登陆是什么_
 - 下一篇: python将变量i的值增加1_Pyth