亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

博湖县| 贵州省| 枣庄市| 奉贤区| 潍坊市| 磐石市| 平阴县| 迁安市| 洪雅县| 古丈县| 木兰县| 旬阳县| 新龙县| 和田县| 莆田市| 孟州市| 安龙县| 香港| 宜春市| 巴青县| 莎车县| 开鲁县| 新安县| 金华市| 满洲里市| 寻乌县| 汾阳市| 江阴市| 依安县| 怀仁县| 宝鸡市| 长泰县| 皮山县| 连城县| 师宗县| 卢氏县| 柯坪县| 涟源市| 永德县| 壶关县| 章丘市|