高階函數(shù)

一.高階函數(shù)

高階函數(shù)至少滿足以下一個條件

  1. 接受一個或者多個函數(shù)作為參數(shù)
  2. 返回一個函數(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)

  • 指的是將原來接受兩個參數(shù)的函數(shù)變成新的接受一個參數(shù)的過程,新的函數(shù)返回一個以原有第二個參數(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ù), 可以增強其他函數(shù)功能
一般接受一個函數(shù)對象作為參數(shù),以對其進行增強

1.裝飾器(無參)

  • 它是一個函數(shù)
  • 函數(shù)作為它的形參
  • 返回值是函數(shù)
  • 可以使用@functionname方式,簡化調(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ù))

  • 它是一個函數(shù)
  • 函數(shù)作為它的形參
  • 返回值是一個不帶參的裝飾器函數(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ù)記錄
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))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容