中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中如何設置與定義被裝飾函數參數

發布時間:2020-08-26 17:25:51 來源:億速云 閱讀:181 作者:Leah 欄目:編程語言

這篇文章運用簡單易懂的例子給大家介紹Python中如何設置與定義被裝飾函數參數,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

被裝飾函數參數的設置與定義

先來看一段代碼

    import time
    
    def timmer(func):
        def inner():
            start_time=time.time()
            func()
            end_time=time.time()
            print("run time: %s " %(end_time-start_time))
        return inner
    
    @timmer
    def index():
        time.sleep(2)
        print("welcome to index page")
    
    @timmer
    def home(name):
        time.sleep(3)
        print("welcome to %s home page" % name)

如上所示,home函數添加了一個參數,而index函數并沒有參數。按照正常的函數的定義與調用方式,調用index函數和home函數的方式應該是下面這種形式:

index()
home("python")

然后我們運行程序就會發現,程序拋出了異常。

  File "E:\python_learn\py_code\test.py", line 28, in <module>
    home("python")
TypeError: inner() takes 0 positional arguments but 1 was given

說個異常說明inner函數不需要位置參數,但是我們給了一個位置參數。回到timmer裝飾器定義的部分,可以看到,timmer裝飾器的內部函數確實沒有定義參數。這樣一來,timmer裝飾器只能用于裝飾沒有參數的函數了,我們可以在timmer裝飾器定義的時候為inner函數添加一個參數。

    import time
    
    def timmer(func):
        def inner(name):
            start_time=time.time()
            func(name)
            end_time=time.time()
            print("run time: %s " %(end_time-start_time))
        return inner
    
    @timmer
    def index():
        time.sleep(2)
        print("welcome to index page")
    
    @timmer
    def home(name):
        time.sleep(3)
        print("welcome to %s home page" % name)
    
    index()
    home("python")

但是這樣一來,timmer裝飾器裝飾index函數的時候又會拋出異常,因為index函數沒有參數。

File "E:\python_learn\py_code\test.py", line 27, in <module>
index()
TypeError: inner() missing 1 required positional argument: 'name'

在不知道被裝飾函數的參數個數的情況下,即被裝飾函數的參數可變長,且形式不固定的時候,可以使用*args和**kwargs,把上面的代碼修改:

    import time
    
    def timmer(func):
        def inner(*args,**kwargs):
            start_time=time.time()
            func(*args,**kwargs)
            end_time=time.time()
            print("run time: %s " %(end_time-start_time))
        return inner
    
    @timmer
    def index():
        time.sleep(2)
        print("welcome to index page")
    
    @timmer
    def home(name):
        time.sleep(3)
        print("welcome to %s home page" % name)
    
    index()
    home("python")

再次運行程序,查看運行結果:

welcome to index page
run time: 2.0 
welcome to python home page
run time: 3.0

由上可知,在不知道被裝飾函數的參數個數時,可以使用*args和**kwargs來表示任意長度任意形式的參數。

被裝飾函數的返回值

修改上面的代碼,為home函數定義一個返回值,分別打印index函數和home函數的返回值。

    import time
    
    def timmer(func):
        def inner(*args,**kwargs):
            start_time=time.time()
            func(*args,**kwargs)
            end_time=time.time()
            print("run time: %s " %(end_time-start_time))
        return inner
    
    @timmer
    def index():
        time.sleep(2)
        print("welcome to index page")
    
    @timmer
    def home(name):
        time.sleep(3)
        print("welcome to %s home page" % name)
        return("home func")
    
    index_res=index()
    print(index_res)
    
    home_res=home("python")
    print(home_res)

運行程序,可以看到:

welcome to index page
run time: 2.0 
None
welcome to python home page
run time: 3.0 
None

可以看到,home函數中定義的返回值并沒有被打印出來,顯示的值為None。因為這里執行的home函數不是原始定義的home函數,而是wrapper函數的執行結果。因為wrapper函數并沒有定義返回值,所以執行被裝飾后的home函數并沒有打印出返回值。

修改代碼,在timmer裝飾器中定義并返回被裝飾函數執行的返回值。

    import time
    
    def timmer(func):
        def inner(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            end_time=time.time()
            print("run time: %s " %(end_time-start_time))
            return res
        return inner
    
    @timmer
    def index():
        time.sleep(2)
        print("welcome to index page")
    
    @timmer
    def home(name):
        time.sleep(3)
        print("welcome to %s home page" % name)
        return("home func")
    
    index_res=index()
    print(index_res)
    
    home_res=home("python")
    print(home_res)

再次執行函數,查看執行結果:

  welcome to index page
    run time: 2.0 
    None
    
    welcome to python home page
    run time: 3.0 
    home func

可以看來,原始home函數中定義的返回值被打印出來了。

結論:

(1)如果被裝飾函數沒有定義返回值,timmer裝飾器裝飾后的返回值為None。

(2)如果被裝飾函數定義了返回值,則timmer裝飾器裝飾后則返回被裝飾函數的返回值。

關于Python中如何設置與定義被裝飾函數參數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴彦县| 张家川| 邵阳市| 武山县| 牙克石市| 中方县| 大田县| 山西省| 曲水县| 孟州市| 彰武县| 柳江县| 循化| 思茅市| 巴彦淖尔市| 云和县| 和平县| 阜康市| 玉屏| 鹿泉市| 太和县| 云阳县| 清水县| 贞丰县| 海口市| 渝中区| 江油市| 云梦县| 启东市| 西青区| 汶川县| 鸡东县| 外汇| 中江县| 公主岭市| 深水埗区| 威宁| 漯河市| 镇巴县| 绍兴市| 井研县|