循序漸進詳解裝飾器

裝飾器概念

  • 裝飾器(Decorators)是 Python 的一個重要部分。簡單地說:他們是修改其他函數的功能的函數。他們有助於讓我們的代碼更簡短,也更Pythonic。

實例

簡單示例

我們先來寫一個簡單的函數,比如求質數。

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

現在我們再來寫一個輸出質數的函數

def prime_nums():
    for i in range(2,10000):
        if is_prime(i):
            print(i)

通過調用is_prime函數,判斷2~10000之間的質數。

如果我們要統計這個函數所需要的時間,那我們就需要使用time模塊計算時間。

def prime_nums(maxnum):
    start = time.time()
    for i in range(2,maxnum):
        if is_prime(i):
            print(i)
    end = time.time()
    result = end-start
    print(result)

這樣我們基本就能知道這個函數運行結束需要多久了,
在這裏插入圖片描述

裝飾器作用

如果我們有很多的函數需要這樣計算運行時間,總不能每一個函數都像這樣寫一遍time.time()吧,這時python的裝飾器就起到了很方便的作用。

計時裝飾器(不帶參數,無返回值)

我們來寫一個計算時間的裝飾器

def display_time(func):
    def wapper():
        t1 = time.time()
        func()
        t2 = time.time()
        print(t2 - t1)
    return wapper

display_time函數中的參數func就是我們需要使用裝飾器的函數,也就是把func這個函數當作參數傳入到了display_time這個函數中。
然後在wapper這個函數中調用了這個傳入的函數。


@display_time
def prime_nums():
    for i in range(2,10000):
        if is_prime(i):
            print(i)

在需要使用裝飾器的函數上加上@裝飾器,即可使用裝飾器的功能。
我們再來運行一次
在這裏插入圖片描述
可以看到效率基本一致,我們的計算功能也實現了。

帶返回值裝飾器

如果我們要判斷質數的函數中質數的數量,並且有返回值,裝飾器怎麼修改。

@display_time
def prime_nums():
    count = 0
    for i in range(2,10000):
        if is_prime(i):
            print(i)
            count += 1
    return count

因爲函數有返回值,所以裝飾器中頁需要用一個變量接收。

def display_time(func):
    def wapper():
        t1 = time.time()
        result = func()
        t2 = time.time()
        print(t2 - t1)
        return result
    return wapper

帶參數裝飾器

如果函數需要傳參呢

@display_time
def prime_nums(maxnum):
    count = 0
    for i in range(2,maxnum):
        if is_prime(i):
            print(i)
            count += 1
    return count

我們使用*args接收函數即可。

def display_time(func):
    def wapper(*args):
        t1 = time.time()
        result = func(*args)
        t2 = time.time()
        print(t2 - t1)
        return result
    return wapper

在這裏插入圖片描述
最後調用函數,得到的結果與我們需求的一致。

關注不迷路哦

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章