日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python进阶(小白也能看懂)——装饰器浅谈(一)

發(fā)布時(shí)間:2025/3/19 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python进阶(小白也能看懂)——装饰器浅谈(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

python進(jìn)階(小白也能看懂)——裝飾器(一)

第四篇

文章目錄

  • python進(jìn)階(小白也能看懂)——裝飾器(一)
    • 1.函數(shù)基礎(chǔ)知識
      • 例子1.1
      • 例子1.2
      • 例子1.3
      • 例子1.4
    • 2.不帶參數(shù)的裝飾器
    • 3.帶參數(shù)的裝飾器
    • 參考

1.函數(shù)基礎(chǔ)知識

談裝飾器前,先了解一下函數(shù)的基礎(chǔ)知識

  • python中一切都是對象,函數(shù)也是對象,可以將一個(gè)函數(shù)賦值給另一個(gè)變量
  • 函數(shù)可以嵌套,即在一個(gè)函數(shù)內(nèi)部定義另一個(gè)函數(shù)
  • 函數(shù)中可以將另一個(gè)函數(shù)作為返回值返回
  • 函數(shù)可以作為參數(shù)傳給另一個(gè)函數(shù)
  • 例子1.1

    ## 定義加法函數(shù) def add_a_b(a, b):print(a+b) ## 將該加法函數(shù)賦給t,這樣t也就是一個(gè)函數(shù)了,擁有加法功能 t = add_a_b t(1,2)""" 3 """

    例子1.2

    # 在函數(shù)內(nèi)部定義函數(shù) def outer():print("I'm in outer")def inner():print("I'm in inner of outer")## 調(diào)用inner函數(shù),且只能在ouer函數(shù)里面調(diào)用innerinner()outer() """ I'm in outer I'm in inner of outer """ inner() """ NameError: name 'inner' is not defined """

    例子1.3

    # 函數(shù)中將另一個(gè)函數(shù)作為返回值返回 def outer():print("I'm in outer")def inner():print("I'm in inner of outer")## 調(diào)用inner函數(shù),且只能在ouer函數(shù)里面調(diào)用innerreturn inner# 這里p相當(dāng)于inner p = outer() p()""" I'm in outer I'm in inner of outer """

    例子1.4

    import timedef runningtime(func):def wrapper(*args, **kwargs):## 添加計(jì)時(shí)功能start = time.time()func(*args, **kwargs)interval = time.time() - startprint("運(yùn)行完{}花費(fèi)了{(lán)}秒".format(func.__name__, interval))return wrapperdef add_a_b(a, b):print(a+b)## equipped_func接收從runningtime返回的函數(shù) equipped_func = runningtime(add_a_b) equipped_func(1000,54489)""" 55489 運(yùn)行完add_a_b花費(fèi)了0.0009965896606445312秒 """

    2.不帶參數(shù)的裝飾器

    所謂裝飾器是作用在函數(shù)身上的,主要是豐富函數(shù)的功能,并且非常方便。
    假設(shè)我們寫了10000個(gè)函數(shù),我們想測試運(yùn)行每個(gè)函數(shù)所需要的時(shí)間,那么可以用裝飾器添加計(jì)算時(shí)間的功能:

    import time from functools import wraps## 定義裝飾器 def runningtime(func):@wraps(func)def wrapper(*args, **kwargs):## 添加計(jì)時(shí)功能start = time.time()func(*args, **kwargs)interval = time.time() - startprint("運(yùn)行完{}花費(fèi)了{(lán)}秒".format(func.__name__, interval))return wrapper@runningtime def add_a_b(a, b):print(a+b)add_a_b(1000,54489)""" 55489 運(yùn)行完add_a_b花費(fèi)了0.00099945068359375秒 """

    與例子1.4對比不難發(fā)現(xiàn)在函數(shù)前面加上@runningtime的作用就相當(dāng)于function = runningtime(function)。

    3.帶參數(shù)的裝飾器

    from functools import wraps import time## 帶參數(shù)的裝飾器 def logging(logfile):def runningtime(func):@wraps(func)def wrapper(*args, **kwargs):## 添加計(jì)時(shí)功能start = time.time()func(*args, **kwargs)interval = time.time() - startprint("運(yùn)行完{}花費(fèi)了{(lán)}秒".format(func.__name__, interval))## 將日志寫入日志文件中with open(logfile,'a') as f:f.write(str(interval)+'\n')return wrapperreturn runningtime@logging('test.txt') def add_a_b(a, b):print(a+b)add_a_b(1000,54489)""" 55489 運(yùn)行完add_a_b花費(fèi)了0.0030028820037841797秒 """

    在這里,帶參數(shù)的裝飾器起的作用相當(dāng)于function = logging('test.txt')(function)

    參考

    定義一個(gè)帶參數(shù)的裝飾器

    總結(jié)

    以上是生活随笔為你收集整理的python进阶(小白也能看懂)——装饰器浅谈(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。