Python 基礎第十一天(閉包和裝飾器初識)
今日內容:
函數名的應用
閉包
裝飾器的初識
裝飾器的傳參
1.函數名的應用
函數名是函數的名字.
本質:變量,特殊的變量。是函數的內存地址
函數名() 可以執行此函數
(1)單獨打印函數名,可以得到函數的內存地址:
print(func1) # <function func1 at 0x0000000000872378>
(2)函數名可以賦值
例:
def func2():
print(666)
#
f = func2
print(f())
(3)函數名可以作為容器類數據的元素。
例:
def f1():
print(‘f1‘)
def f2():
print(‘f2‘)
def f3():
print(‘f3‘)
l = [f1,f2,f3]
d = {‘f1‘:f1,‘f2‘:f2,‘f3‘:f3}
#調用
l[0]()
d[‘f2‘]()
(4)函數可以作為參數
def f1():
print(666)
def f2(x): # x = f1
x() # f1()
f2(f1)
(5)函數名可以作為函數的返回值
def wraaper():
def inner():
print(666)
return inner
ret = wraaper() # inner
ret() # inner()
#此代碼的流程分析
代碼由 上而下,def 設置了一個wraaper的變量名,由於沒有引用變量,一直向下,到達,ret = wraaper(),看到變量賦值,優先計算等號右邊的,即wraaper(),引用wraaper()函數,然後進入下一層, def inner(),記錄變量名稱,不走變量體,return返回inner,函數結束.return將inner返回給函數調用者,wraaper(),即ret = inner
然後運行代碼inner(),然後找到局部空間內的inner函數,繼續執行inner下面的內容.直到代碼結束.
2.閉包
就是內層函數對外層函數(非全局)變量的引用。
python遇到閉包,有一個機制,會開辟一個空間,將閉包中的所有的變量等存儲起來,不隨著函數的結束而關閉。
閉包的完美體現:裝飾器。
如何判斷:內層函數名.__closure__ cell 就是=閉包
例題
def wraaper1():
name = ‘老男孩‘
def inner():
print(name)
inner()
print(inner.__closure__)
wraaper1()
# cell返回,則是閉包
name = ‘老男孩‘
def wraaper2():
name1 = ‘alex‘
inner()
print(name)
print(name1)
print(inner.__closure__) # None
wraaper2()
變量name為全局變量,不屬於外層函數的,所以不是閉包
裝飾器初識:
什麽是裝飾器:
裝飾器是在不改變現有函數的調用方式的情況下,對函數功能改變或者添加新的功能的新函數叫做裝飾器.
也可以描述為在不改變原函數的執行的情況下,為原函數增加額外的功能
裝飾器的固定格式:(被裝飾函數帶參數的裝飾器)
def wrapper(funcl):
def inner(*args,**kwargs):
‘‘‘被裝飾函數運行之前‘‘
retsalt = funcl(*args,**kwargs)
‘‘‘被裝飾函數運行之後‘‘‘
return retsalt
return inner
@wrapper #funcl = wrapper(funcl) 可以理解為這個等式這種形式 @wrapper 叫做語法糖
def funcl(a,b)
pass
funcl()
例題:(不帶參數版本)
def timmer(f): # f = func1
def inner():
start_time = time.time()
f() # func1()
time.sleep(0.3)
end_time = time.time()
print(‘此函數的執行效率%s‘ % (end_time - start_time))
return inner
# 語法糖@
@timmer # func1 = timmer(func1)
def func1():
print(‘你有病呀,領導,測試我的執行效率幹甚。‘)
func1() # inner()
例題(被裝飾函數帶參數的版本)
def timmer(f): # f = func1 函數名
def inner(*args,**kwargs):
start_time = time.time()
f(*args,**kwargs)
time.sleep(0.3)
end_time = time.time()
print(‘此函數的執行效率%s‘ % (end_time - start_time))
return inner
@timmer # func1 = timmer(func1) # inner
def func1(a,b):
print(a,b)
print(‘你有病呀,領導,測試我的執行效率幹甚。‘)
func1(a,b)
如果能把這個過程理解了就明白了,裝飾器的基本流程.
Python 基礎第十一天(閉包和裝飾器初識)