十、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)
---------------------------------------------------