第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

裝飾器問(wèn)題歸納

標(biāo)簽:
Python

1.什么是装饰器?

复制代码

import timedef timmer(func):
    start = time.time()
    func()
    end = time.time()    print(end - start)    # return end - start@timmerdef foo():
    time.sleep(3)    print('hhh')

foo #1#执行结果:#hhh#3.0004751682281494

复制代码

 

以上例子我们通过一个timmer装饰器希望计算foo函数的运行时间

整个过程其实可以理解为:一个函数的嵌套

即将foo函数嵌套入了timmer函数,类似于timmer(foo)

 

思考:但是为什么#1位置调用foo函数时不是使用foo()而是foo呢???

我们试一下

复制代码

import timedef timmer(func):
    start = time.time()
    func()
    end = time.time()    print(end - start)    # return end - start@timmerdef foo():
    time.sleep(3)    print('hhh')

foo()# 执行结果:# hhh# Traceback (most recent call last):# 3.000311851501465#   File "E:/python/ftp_work/test.py", line 18, in <module>#     foo()# TypeError: 'NoneType' object is not callable

复制代码

错误显示:'NoneType' object is not callable

原因是python装饰器设计在这一点上其实是不友好的

foo()相当于timmer(foo)(),而timmer(foo)()并不是一个可以运行的函数,因为timmer函数没有一个可执行的返回值

我们做如下修改

复制代码

import timedef timmer(func):    def inner():
        start = time.time()
        func()
        end = time.time()        print(end - start)    return inner
@timmerdef foo():
    time.sleep(3)    print('hhh')

foo()# 执行结果:# hhh# 3.000600576400757

复制代码

得到了我们想要的结果

上面的修改给timmer函数的调用给一个inner返回值

所以执行timmer(foo)()时,就将timmer(foo)变为了一个可执行的函数

 

 

2.带有装饰器的函数有参数的情况

复制代码

import timedef timmer(func):    def inner(i):
        start = time.time()
        func(i)
        end = time.time()        print(end - start)    return inner
@timmerdef foo(i):
    time.sleep(3)    print(i)

foo('hhh')# 执行结果:# hhh# 3.000600576400757

复制代码

这里需要注意在foo函数的参数给装饰器传递时

并不是传递给了timmer函数,而是inner函数,类似于foo(i) == timmer(inner)(i) == inner(i)

 

3.装饰器带参数的情况

这种情况我们需要在装饰器外面再嵌套一个函数来专门接收装饰器传来的参数

 

复制代码

import timedef new_timmer(j):    print(j)    def timmer(func):        def inner(i):
            start = time.time()
            func(i)
            end = time.time()            print(end - start)        return inner    return timmer


@new_timmer('xxx')def foo(i):
    time.sleep(3)    print(i)

foo('hhh')# 执行结果:# xxx# hhh# 3.0002424716949463

复制代码

可以理解为foo(i) == new_timmer(j)()(i) == timmer(foo)(i) == inner(i)

 

 

 

参考:https://www.tuicool.com/articles/FBZvya

原文出处:https://www.cnblogs.com/Rongze-blog/p/9575285.html

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消