裝飾器概念
- 裝飾器(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
最後調用函數,得到的結果與我們需求的一致。