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)