一.高階函數(shù)
高階函數(shù)至少滿足以下一個(gè)條件
- 接受一個(gè)或者多個(gè)函數(shù)作為參數(shù)
- 返回一個(gè)函數(shù)
1. 內(nèi)建函數(shù)-高階函數(shù)
- sorted(iterable[, key][, reverse]) --> list
- filter(function or None, iterable) --> filter object
- map(func, *iterables) --> map objec
2. 柯里化(Currying)
- 指的是將原來(lái)接受兩個(gè)參數(shù)的函數(shù)變成新的接受一個(gè)參數(shù)的過(guò)程逗威,新的函數(shù)返回一個(gè)以原有第二個(gè)參數(shù)為參數(shù)的函數(shù)
- z=f(x,y) 轉(zhuǎn)化成 z=f(x)(y) 的形式
def add(x,y):
return x + y
#add(5,6)
def add(x):
def _add(y):
return x + y
return _add
#add(5)(6)
二.裝飾器
自身是函數(shù)鞠柄, 可以增強(qiáng)其他函數(shù)功能
一般接受一個(gè)函數(shù)對(duì)象作為參數(shù)瞧壮,以對(duì)其進(jìn)行增強(qiáng)
1.裝飾器(無(wú)參)
- 它是一個(gè)函數(shù)
- 函數(shù)作為它的形參
- 返回值是函數(shù)
- 可以使用
@functionname
方式秦忿,簡(jiǎn)化調(diào)用
def add(x,y):
return x + y
def logger(fn):
def warpper(*args,**kwargs):
print("args={},kwargs={}".format(args,kwargs))
x = fn(*args,**kwargs)
return x
return warpper
logger(add)(4,y=5)
以下add 的使用裝飾器的代碼
def logger(fn):
def warpper(*args,**kwargs):
print("args={},kwargs={}".format(args,kwargs))
x = fn(*args,**kwargs)
return x
return warpper
@logger # add = logger(add)
def add(x,y):
return x + y
add(4,y=5) # logger(add)(4,y=5) - > warpper(4,y=5)
2.裝飾器(帶參數(shù))
- 它是一個(gè)函數(shù)
- 函數(shù)作為它的形參
- 返回值是一個(gè)不帶參的裝飾器函數(shù)
- 可以使用
@functionname(參數(shù)列表)
方式調(diào)用 - 可以看作在裝飾器外層又加了一層函數(shù)
def copy_properties(fn):
"""
將裝飾器函數(shù)的屬性 修改 成被裝飾器裝飾的函數(shù)的屬性
"""
def _copy(decorator_fn):
decorator_fn.__name__ = fn.__name__
decorator_fn.__doc__ = fn.__doc__
return decorator_fn
return _copy
def logger(fn):
def wrapper(*args,**kwargs):
"""This is function warpper"""
x = fn(*args,**kwargs)
return x
copy_properties(fn)(wrapper)
return wrapper
@logger
def add(x,y):
"""Thie is function add"""
return x + y
add.__doc__
可以修改成如下代碼
def copy_properties(fn):
"""
將裝飾器函數(shù)的屬性 修改 成被裝飾器裝飾的函數(shù)的屬性
"""
def _copy(decorator_fn):
decorator_fn.__name__ = fn.__name__
decorator_fn.__doc__ = fn.__doc__
return decorator_fn
return _copy
def logger(fn):
#warpper = copy_properties(fn)(wrapper)
@copy_properties(fn)
def wrapper(*args,**kwargs):
"""This is function warpper"""
x = fn(*args,**kwargs)
return x
return wrapper
@logger
def add(x,y):
"""Thie is function add"""
return x + y
add.__doc__
import time
import datetime
# 獲取函數(shù)的執(zhí)行時(shí)長(zhǎng),對(duì)時(shí)長(zhǎng)超過(guò)閥值的函數(shù)記錄
def logger(duration):
def _logger(fn):
@copy_properties(fn) # wrapper=wrapper(fn)(warpper)
def wrapper(*args,**kwargs):
start = datetime.datetime.now()
ret = fn(*args,**kwargs)
delta = (datetime.datetime.now()-start).total_seconds()
print("so slow") if delta > duration else print('so fase')
return ret
return wrapper
return _logger
@logger(5) # add= logger(5)
def add(x,y):
time.sleep(5)
return x + y
print(add(5,6))