python基礎(chǔ)--匿名函數(shù)&高階函數(shù)&裝飾器

lambda表達式返回匿名函數(shù)

  • python使用lambda創(chuàng)建匿名函數(shù)旺拉,lambda的主題是一個表達式而不是代碼塊
  • 格式: lambda 參數(shù) : 表達式肮雨,返回lambda函數(shù)弟断,匿名函數(shù)的返回值即表達式的運算值
a = lambda x, y: x + y    # lambda表達式返回匿名函數(shù)殊霞,然后變量a指向此匿名函數(shù)
print(a)                  # lambda函數(shù): <function <lambda> at 0x000001FE58231E18>
a(1, 2)                   # 返回:3


# 直接調(diào)用lambda匿名函數(shù)本身
(lambda x, y: x+y)(x=1, y=2)     # 返回:3


# lambda作為函數(shù)返回值
def test():
    return lambda x, y: x + y

b = test()
print(b)     # 函數(shù)類型:<function test.<locals>.<lambda> at 0x000001FE585A5730>
b(1, 2)      # 返回:3

高階函數(shù)

  1. 函數(shù)作為參數(shù)值,應用廣泛顽腾,類似于:f(g(x))
  2. 函數(shù)作為返回值壁顶,往往形成閉包珠洗,類似于:f(x)(y)
  • 關(guān)于閉包:
    • 有權(quán)訪問另一個函數(shù)作用域內(nèi)變量的函數(shù)都是閉包。
    • 閉包就是 一個函數(shù)引用另一個函數(shù)中的變量若专,因為變量被引用著所以不會被回收(正好印證了垃圾回收機制的引用計數(shù)機制)许蓖。
    • 閉包影響的是變量的生命周期,因此可以用于封裝一個私有變量调衰,這是優(yōu)點也是缺點膊爪,缺點就是不必要的閉包只會徒增內(nèi)存消耗。

柯里化函數(shù)

  • 柯里化:將原來接受兩個/多個參數(shù)的函數(shù)改為接受一個參數(shù)的函數(shù)嚎莉,該函數(shù)返回嵌套在該函數(shù)里接收所有剩余參數(shù)的函數(shù)米酬。
  • 柯里化函數(shù)的運行過程就是參數(shù)的收集過程,我們將每一次傳入的參數(shù)收集起來趋箩,并在最里層的函數(shù)中進行處理赃额。
  • f(x, y) 轉(zhuǎn)化為 f(x)(y)
def add(x, y):
    return x+y

def currying_add(x):
    def inner_add(y):
        return x+y
    return inner_add       # 返回內(nèi)嵌的函數(shù)

def currying_add(x):
    return lambda y: x+y   # 直接使用lambda表達式,返回匿名的函數(shù)

currying_add(4)(5)    # 同 add(4, 5)

python裝飾器

  • 裝飾器就是一個閉包叫确,為了不影響現(xiàn)有的函數(shù)跳芳,將被裝飾的函數(shù)作為參數(shù)傳遞給一個裝飾器函數(shù),并返回增強后的被裝飾的函數(shù)启妹。
  • 帶參裝飾器和無參裝飾器
def logger(fn):
    def wrap(*args, **kwargs)
        ret = fn(*args, **kwargs)   # 閉包,fn函數(shù)沒有被回收醉旦,所以fn就會替換指向add
        print('函數(shù)參數(shù)類型:{}饶米,{}'.format(args, wargs))
        return ret
    return wrap

# 語法糖: 等價于add = logger(add)桨啃,add被包裝函數(shù)替換
@logger    
def add(x, y):
  return x+y

foo = logger(add)    # 內(nèi)嵌wrap函數(shù)
foo(1, 2)        # 實參為args,輸出:函數(shù)參數(shù)類型:'(1, 2), {}'檬输,返回:3
foo(x=1, y=2)    # 實參為kwargs照瘾,輸出:函數(shù)參數(shù)類型:'(), {x=1, y=2}',返回:3


add = logger(add) # 因為add作為實參傳遞給fn之后丧慈,fn被wrap引用所以fn并沒有銷毀析命,這里的add增強后的函數(shù)
add(1, 2)   # 此處的add是增強后的add
  • 帶參數(shù)的裝飾器
@router.get("/student2/list", response=List[StudentSchemaOut])
@paginate(MyPagination)
# listStudent = paginate(listStudent)
def listStudent(request, filters: FiltersSchema = Query(...)):
    query_set = lists(request, filters, StudentInfo)
    return query_set

def paginate(
    func_or_pgn_class: Any = NOT_SET, **paginator_params: DictStrAny
) -> Callable:
    """
    @api.get(...
    @paginage
    def my_view(request):

    or

    @api.get(...
    @paginage(PageNumberPagination)
    def my_view(request):

    """

    isfunction = inspect.isfunction(func_or_pgn_class)
    isnotset = func_or_pgn_class == NOT_SET

    pagination_class: Type[PaginationBase] = import_string(settings.PAGINATION_CLASS)

    if isfunction:
        return _inject_pagination(func_or_pgn_class, pagination_class)

    if not isnotset:
        pagination_class = func_or_pgn_class

    def wrapper(func: Callable) -> Any:
        return _inject_pagination(func, pagination_class, **paginator_params)

    return wrapper

使用functools的wrap實現(xiàn)日志記錄裝飾器

https://blog.csdn.net/weixin_44799217/article/details/118695357

https://blog.csdn.net/lzf9651/article/details/139641445

from functools import wraps


# 添加操作日志裝飾器--不帶參數(shù)的裝飾器
def addLog(fn):
     """
     @api.get(...
     @addLog
     def my_view(request):

     """
     @wraps(fn)
     def wrapper(*args, **kwargs):
         create(data={"operate_module": "aaa"}, model=SkssLog)
         return fn(*args, **kwargs)
     return wrapper


# 添加操作日志裝飾器---帶參數(shù)的裝飾器
def addLog(comment):
    """
    @api.get(...
    @addLog("添加日志")
    def my_view(request):

    """

    def log(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            create(data={"operate_module": comment}, model=SkssLog)
            return fn(*args, **kwargs)

        return wrapper
    return log

@property裝飾器

  • python內(nèi)置的@property裝飾器就是負責把一個方法變成只讀屬性調(diào)用。
class A(object):
    
    _name = 'testA'

    @property
    def test(self):
        return self._name

    @property        # 定義對象的讀取getter屬性test2
    def test2(self):
        return self._age
 
    @test2.setter    # 定義對象的寫setter屬性
    def test2(self, age):
        self._age = age


a = A()
print(a.test)    # 把test()方法作為屬性調(diào)用逃默,不用加上小括號鹃愤,返回:'testA'
print(a.test())  # 報錯:TypeError: 'str' object is not callable
a.test2 = 24
print(a.test2)   # 返回:24
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市完域,隨后出現(xiàn)的幾起案子软吐,更是在濱河造成了極大的恐慌,老刑警劉巖吟税,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凹耙,死亡現(xiàn)場離奇詭異,居然都是意外死亡肠仪,警方通過查閱死者的電腦和手機肖抱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來异旧,“玉大人意述,你說我怎么就攤上這事≡笏遥” “怎么了欲险?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匹涮。 經(jīng)常有香客問我天试,道長,這世上最難降的妖魔是什么然低? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任喜每,我火速辦了婚禮,結(jié)果婚禮上雳攘,老公的妹妹穿的比我還像新娘带兜。我一直安慰自己,他們只是感情好吨灭,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布刚照。 她就那樣靜靜地躺著,像睡著了一般喧兄。 火紅的嫁衣襯著肌膚如雪无畔。 梳的紋絲不亂的頭發(fā)上啊楚,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音浑彰,去河邊找鬼恭理。 笑死,一個胖子當著我的面吹牛郭变,可吹牛的內(nèi)容都是我干的颜价。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼诉濒,長吁一口氣:“原來是場噩夢啊……” “哼周伦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起循诉,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤横辆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茄猫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狈蚤,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年划纽,在試婚紗的時候發(fā)現(xiàn)自己被綠了脆侮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡勇劣,死狀恐怖靖避,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情比默,我是刑警寧澤幻捏,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站命咐,受9級特大地震影響篡九,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜醋奠,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一榛臼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窜司,春花似錦沛善、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春尤蛮,著一層夾襖步出監(jiān)牢的瞬間漠秋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工抵屿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捅位。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓轧葛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艇搀。 傳聞我的和親對象是個殘疾皇子尿扯,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349