Python全棧(第一期)Day11
阿新 • • 發佈:2018-12-19
今日重點:
初識裝飾器
一,昨日重點複習
作用域鏈 :
小範圍用變數的時候,先從自己的名字空間找,
找不到就一層一層向外層找,知道找到為止。
找不到就報錯。
函式名的本質:
就是一串記憶體地址 可以賦值、可以作為容器型別的元素、函式的引數和返回值 —— 第一類物件
閉包:
內部函式使用外部函式的變數
def outer():
a = 1
def inner():
print(a)
return inner
i = outer()
i()
二,作業講解
#寫函式,接收n個數字,求這些引數數字的和。 def sum_func(*args): print(args) print(type(args)) total = 0 for i in args: total += i return total print(sum_func(1,2,3,8,23,6))
輸出結果:
(1, 2, 3, 8, 23, 6)
<class ‘tuple’>
43
三,裝飾器
1,基本知識點
裝飾器形成的過程 : 最簡單的裝飾器---->有返回值的---->有一個引數---->萬能引數
裝飾器的作用:不想修改函式的呼叫方式 但是還想在原來的函式前後新增功能
原則 :開放封閉原則
語法糖 :@
補充一點小知識:
import time
print(time.time()) # 獲取當前時間
time.sleep(10) #讓程式在執行到這個位置的時候停一會兒
print('停留十秒之後~')
輸出結果:
1543042834.1915605
停留十秒之後~
2,case:計算程式執行時間
import time def fun(): print('老闆同事大家好!') print('老闆同事大家好!') time.sleep(5) print('老闆同事大家好!') print('老闆同事大家好!') def timmer(func): #裝飾器函式 start = time.time() func() #被裝飾的函式 end = time.time() return (end - start) time = timmer(fun) print(time)
輸出結果:
老闆同事大家好!
老闆同事大家好!
老闆同事大家好!
老闆同事大家好!
5.000150442123413
存在問題:
但是這樣呼叫很麻煩,而且別人不知道,我們應該還是想辦法呼叫func,而不是timmer。
3,改進
語法糖:
緊靠著被裝飾函式,可以去掉:func = timmer(func)
import time
def timmer(f): #裝飾器函式
'''
Note:這裡返回:reture inner 不能返回:return inner()
:param f:
:return:
'''
def inner():
start = time.time()
ret = f() #被裝飾的函式
end = time.time()
print(end - start)
return ret
return inner
@timmer
def func(): #被裝飾的函式
time.sleep(0.01)
print('老闆好同事好大家好')
return '新年好'
#func = timmer(func)
ret = func() #其實這裡的func(),根本就不是我們上面的func()
#這裡的func本質是inner
print(ret)
輸出結果:
老闆好同事好大家好
0.010993719100952148
新年好
4,一個完美裝飾器
import time
def timmer(f): #裝飾器函式
def inner(*args, **kwargs):
start = time.time()
ret = f(*args, **kwargs) #f(1,2) #被裝飾的函式
end = time.time()
print(end - start)
return ret
return inner
@timmer #語法糖 @裝飾器函式名
def func(a, b): #被裝飾的函式
time.sleep(0.01)
print('老闆好同事好大家好', a, b)
return '新年好!'
@timmer #語法糖 @裝飾器函式名
def func1(a): #被裝飾的函式
time.sleep(0.01)
print('老闆好同事好大家好', a)
return '過年好!'
ret = func(1, 2) #inner()
print(ret)
print('**************************')
ret = func1(1) #inner()
print(ret)
輸出結果:
老闆好同事好大家好 1 2
0.010993242263793945
新年好!
Hello python
老闆好同事好大家好 1
0.010993719100952148
過年好!