十、python 嵌套函數、閉包裝飾器、裝飾器例子
python的函數可以嵌套定義
閉包:能夠保留函數定義時的環境信息
嵌套函數的定義:
內部函數用到咯外部函數中的變量
外部函數返回內部函數
def outer():
def inner():
...
return inner
----------------------------------------------------------
#閉包,一定是嵌套函數(函數也是對象)
def f(x):
y = 100
def inner(z):
return x * y + z
return inner
a10 = f(10)
a20 = f(20)
print a10(29),a20(29)
------------------------------------------------
裝飾器
不帶參數裝飾器:
decorator(f)(*args,**kwags)
@decorator
def f():
...
帶參數裝飾器:
decorator(name)(f)(*args,**kwags)
@decorator(name)
def f():
...
-----------------------------裝飾器例子--------------------
-----------------------------日誌裝飾器----------------------------
import time
#想打印方法被調用的詳細信息日誌(開始時間、結束時間等)
def f(x,y):
return x+y
def f1(x,y):
print 'calling f2',x,y
start = time.clock()
z = x+y #相當於把方法中的業務拿下來,修改很麻煩,難適合任意函數
end = time.clock()
print 'start at:',start,'end at:',end
return z
print f(10,20)
print f1(10,20)
#使用裝飾器來做。裝飾器是用閉包來做的
def log(func): #func是被裝飾函數的名稱。無參數的裝飾器
def wrapper(*args, **kwargs): #裝飾器要適用所有的函數所以參數定義用任意的
print '~' * 40
start = time.clock()
res = func(*args,**kwargs)
end = time.clock()
print 'calling', func.__name__
print 'start at:',start,' end at:',end
return res
return wrapper
def logEx(name): ##帶參數的裝飾器,三層嵌套。
def wrapper(func):
def wrapper1(*args,**kwargs):
print '~' * 40
start = time.clock()
res = func(*args, **kwargs)
end = time.clock()
print name, ' calling ', func.__name__, args
print 'start at:', start, ' end at:', end
return res
return wrapper1
return wrapper
@log #裝飾器一定要在使用函數之前調用;同時這個是不帶參數的裝飾器
def f(x,y):
return x+y
@logEx('aidon')
def f2(x,y):
return x*y
print f(20,30)
print f2(20,30)
---------------------------------------------------------------
-------------------------------------------------
##身份認證裝飾器
def authorize(func):
def wrapper(*args,**kwargs):
if True:
print 'welcome'
return func(*args,**kwargs)
else:
print 'faild'
return wrapper
@logEx('aidon')
@authorize
def f2(x,y):
return x*y
print f2(20,30)
---------------------------------------------------