python Decorator (裝飾器)

Python 裝飾器Python 裝飾器

Decorator

使用kotlin的時(shí)候發(fā)現(xiàn)有個(gè)函數(shù)很好玩 measureTimeMillis 統(tǒng)計(jì)函數(shù)的使用時(shí)間的澳化。一下子就想到python里面的裝飾器.

講一下 為什么要使用裝飾器崔步,什么場景下會(huì)使用。舉個(gè)例子

這是一個(gè)輸出2-10000之間的所有質(zhì)數(shù)


def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

def prime_nums():

    for i in range(2, 10000):

        if is_prime(i):

            print(i)

prime_nums()

現(xiàn)在加一個(gè)小小的需求缎谷,比如想知道這段代碼的執(zhí)行的時(shí)間井濒。


import time

def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

def prime_nums():

    start = time.time()

    for i in range(2, 10000):

        if is_prime(i):

            print(i)

    end = time.time()

    print(end - start)

prime_nums()

像這樣的代碼 ,應(yīng)該都會(huì)寫吧列林。邏輯也不復(fù)雜瑞你,但是里面有個(gè)小小的問題,就是 prime_nums() 這個(gè)方法里面既有邏輯的部分 又包含有計(jì)時(shí)的部分希痴,可讀性比較差者甲,要是有更多的函數(shù) 也需要計(jì)時(shí)部分,是不是都要寫一個(gè) 開始時(shí)間砌创,結(jié)束時(shí)間虏缸。 這個(gè)時(shí)候 就可以用到裝飾器了。代碼如下 @display_time


import time

def display_time(func):

    def wrapper():

        start = time.time()

        func()

        end = time.time()

        print("時(shí)間: {:.4} s".format(end - start))

    return wrapper

def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

@display_time

def prime_nums():

    for i in range(2, 10000):

        if is_prime(i):

            print(i)

prime_nums()

接下來 又來一個(gè)小需求嫩实,就是我想統(tǒng)計(jì)一下 2-10000之間有多少質(zhì)數(shù) 又該怎么處理呢刽辙。


import time

def display_time(func):

    def wrapper():

        start = time.time()

        # 記錄一下返回值

        result = func()

        end = time.time()

        print(end - start)

        return result

    return wrapper

def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

@display_time

def prime_nums():

    count = 0

    for i in range(2, 10000):

        if is_prime(i):

            # print(i)

            count += 1

    return count

count = prime_nums()

print(count)

接下來 又有一個(gè)小需求,我想知道2-任意數(shù) 之間的所有質(zhì)數(shù)甲献。這個(gè)時(shí)候 就得對prime_nums() 函數(shù)增加參數(shù)了宰缤,這個(gè)時(shí)候的裝飾器應(yīng)該怎么寫呢。


import time

def display_time(func):

    # 增加參數(shù)

    def wrapper(*args):

        start = time.time()

        # 記錄一下返回值

        result = func(*args)

        end = time.time()

        print("時(shí)間: {:.4} s".format(end - start))

        # 把函數(shù)的結(jié)果再次返回出去

        return result

    return wrapper

def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

@display_time

def prime_nums(max):

    count = 0

    for i in range(2, max):

        if is_prime(i):

            # print(i)

            count += 1

    return count

count = prime_nums(10000)

print(count)

Decorator

使用kotlin的時(shí)候發(fā)現(xiàn)有個(gè)函數(shù)很好玩 measureTimeMillis 統(tǒng)計(jì)函數(shù)的使用時(shí)間的。一下子就想到python里面的裝飾器.

講一下 為什么要使用裝飾器慨灭,什么場景下會(huì)使用朦乏。舉個(gè)例子

這是一個(gè)輸出2-10000之間的所有質(zhì)數(shù)


def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

def prime_nums():

    for i in range(2, 10000):

        if is_prime(i):

            print(i)

prime_nums()

現(xiàn)在加一個(gè)小小的需求,比如想知道這段代碼的執(zhí)行的時(shí)間氧骤。


import time

def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

def prime_nums():

    start = time.time()

    for i in range(2, 10000):

        if is_prime(i):

            print(i)

    end = time.time()

    print(end - start)

prime_nums()

像這樣的代碼 呻疹,應(yīng)該都會(huì)寫吧。邏輯也不復(fù)雜语淘,但是里面有個(gè)小小的問題诲宇,就是 prime_nums() 這個(gè)方法里面既有邏輯的部分 又包含有計(jì)時(shí)的部分,可讀性比較差惶翻,要是有更多的函數(shù) 也需要計(jì)時(shí)部分姑蓝,是不是都要寫一個(gè) 開始時(shí)間,結(jié)束時(shí)間吕粗。 這個(gè)時(shí)候 就可以用到裝飾器了纺荧。代碼如下 @display_time


import time

def display_time(func):

    def wrapper():

        start = time.time()

        func()

        end = time.time()

        print("時(shí)間: {:.4} s".format(end - start))

    return wrapper

def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

@display_time

def prime_nums():

    for i in range(2, 10000):

        if is_prime(i):

            print(i)

prime_nums()

接下來 又來一個(gè)小需求,就是我想統(tǒng)計(jì)一下 2-10000之間有多少質(zhì)數(shù) 又該怎么處理呢颅筋。


import time

def display_time(func):

    def wrapper():

        start = time.time()

        # 記錄一下返回值

        result = func()

        end = time.time()

        print(end - start)

        return result

    return wrapper

def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

@display_time

def prime_nums():

    count = 0

    for i in range(2, 10000):

        if is_prime(i):

            # print(i)

            count += 1

    return count

count = prime_nums()

print(count)

接下來 又有一個(gè)小需求宙暇,我想知道2-任意數(shù) 之間的所有質(zhì)數(shù)。這個(gè)時(shí)候 就得對prime_nums() 函數(shù)增加參數(shù)了议泵,這個(gè)時(shí)候的裝飾器應(yīng)該怎么寫呢占贫。


import time

def display_time(func):

    # 增加參數(shù)

    def wrapper(*args):

        start = time.time()

        # 記錄一下返回值

        result = func(*args)

        end = time.time()

        print("時(shí)間: {:.4} s".format(end - start))

        # 把函數(shù)的結(jié)果再次返回出去

        return result

    return wrapper

def is_prime(num):

    if num < 2:

        return False

    elif num == 2:

        return True

    else:

        for i in range(2, num):

            if num % i == 0:

                return False

        return True

# 輸出2 - 10000 之間的所有質(zhì)數(shù)

@display_time

def prime_nums(max):

    count = 0

    for i in range(2, max):

        if is_prime(i):

            # print(i)

            count += 1

    return count

count = prime_nums(10000)

print(count)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市先口,隨后出現(xiàn)的幾起案子型奥,更是在濱河造成了極大的恐慌,老刑警劉巖碉京,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厢汹,死亡現(xiàn)場離奇詭異,居然都是意外死亡谐宙,警方通過查閱死者的電腦和手機(jī)烫葬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凡蜻,“玉大人搭综,你說我怎么就攤上這事⊙蚀桑” “怎么了设凹?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茅姜。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么钻洒? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任奋姿,我火速辦了婚禮,結(jié)果婚禮上素标,老公的妹妹穿的比我還像新娘称诗。我一直安慰自己,他們只是感情好头遭,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布寓免。 她就那樣靜靜地躺著,像睡著了一般计维。 火紅的嫁衣襯著肌膚如雪袜香。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天鲫惶,我揣著相機(jī)與錄音蜈首,去河邊找鬼。 笑死欠母,一個(gè)胖子當(dāng)著我的面吹牛欢策,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赏淌,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼踩寇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了六水?” 一聲冷哼從身側(cè)響起俺孙,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缩擂,沒想到半個(gè)月后鼠冕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胯盯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年懈费,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片博脑。...
    茶點(diǎn)故事閱讀 40,926評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憎乙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叉趣,到底是詐尸還是另有隱情泞边,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布疗杉,位于F島的核電站阵谚,受9級(jí)特大地震影響蚕礼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梢什,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一奠蹬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗡午,春花似錦囤躁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至僻他,卻和暖如春宵距,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背中姜。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工消玄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丢胚。 一個(gè)月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓翩瓜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親携龟。 傳聞我的和親對象是個(gè)殘疾皇子兔跌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 文中知識(shí)點(diǎn)和代碼示例學(xué)習(xí)自慕課網(wǎng),python進(jìn)階部分(http://www.imooc.com/learn/31...
    SateZheng閱讀 1,224評論 0 2
  • 對于每一個(gè)學(xué)習(xí)Python 的同學(xué)仅乓,想必對@符號(hào)一定不陌生了,正如你所知蓬戚,@符號(hào)是裝飾器的語法糖夸楣,@符號(hào)后面的函數(shù)...
    EchoPython閱讀 909評論 1 9
  • 裝飾器從何而來 Long long ago, 你寫了一段代碼,一段非常漂亮的代碼子漩。 現(xiàn)在你想看看這段代碼在你機(jī)器上...
    皮皮大閱讀 338評論 0 3
  • 起了一個(gè)大早豫喧,洗澡,洗頭幢泼,敷面膜……最后素顏出門……這就是月兒紧显。 月兒說,自己不喜歡化妝缕棵,因?yàn)榉醢啵昵嗑褪亲蠲篮玫娜?..
    藍(lán)凌紙鳶閱讀 199評論 0 0
  • 文/明月滄海 煙是筆直的向上升起的重父,天地之間一點(diǎn)風(fēng)絲兒都沒有花椭,陳秋茵望著那縷直直的青煙忽匈,突然間就覺得自己回到了過去...
    作家明月滄海閱讀 2,616評論 41 67