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][,reverse]) 排序,回傳一個串列
filter(function, iterable) 過濾可迭代物件的元素,回傳一個迭代器
map(function, *iterable) -->map object 對多個可迭代物件的元素按照指定的函式進行映射,回傳一個迭代器
2 裝飾器
2.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
# 如下呼叫,python學習交流群:489111204
add = logger(add) # 因為函式呼叫的關系,引數add的參考用在函式內部保存
add(4, 5) # 呼叫的是內部保存的add參考,而非原本的add函式
Python將其改進為裝飾器
#Python學習交流QQ群:489111204
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))
裝飾器是高階函式一個重要應用,是對傳入函式的功能裝飾或者是功能增強,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541638.html
標籤:Python
上一篇:【Python爬蟲實戰專案】Python爬蟲批量下載相親網站資料并保存本地(附原始碼)
下一篇:Python中的例外處理總結
