2.11 函数 (四)
装饰器
In [130]:
a = 10
b = [12,12]
def test():
print('test')
c = test
In [131]:
c
Out[131]:
<function __main__.test>
In [132]:
c.__name__
# c 实际是 test
Out[132]:
'test'
可以把函数赋值给一个变量 写函数时往往是有返回值的,函数可以返回一个函数
In [133]:
def test(func):
return func #返回它本身
def func():
print('func run')
test(func)
Out[133]:
<function __main__.func>
In [134]:
def test(func):
return func
def func():
print('func run')
f = test(func)
f.__name__
Out[134]:
'func'
In [135]:
def test(func):
return func
def func():
print('func run')
f = test(func)
f.__name__
f()
func run
函数可以当做函数的返回值进行返回
random生成的是一个从0到10的floot类型的随机数
#随机生成一个从0到1的浮点值
In [142]:
random.random()
Out[142]:
0.8830469492906753
In [143]:
def test():
return random.random() #返回一个从0到1的浮点值
#要求函数返回的浮点值保留3个有效数字 (不太好)
In [144]:
def test():
return round(random.random(),3)
In [145]:
test()
Out[145]:
0.736
另一个语法糖,装饰器
#返回一个从0到1的浮点值
In [147]:
def test():
return random.random()
In [148]:
def decorator(func): #传进来func,(func是test函数)
def wrapper(*args,**kwargs):
return func()
return wrapper # 返回wrapper ,wrapper 又是一个函数名,wrpper执行的的就是开始传进去的function,wrapper接受的任何参数都会传给function
In [149]: f = decorator(test)
In [150]: f
Out[150]:
<function __main__.decorator.<locals>.wrapper>
In [151]:
f()
Out[151]:
0.20663489784291156
In [157]: f.__name__
#f可以当做funtion来调用 #function 翻译 :功能、函数
Out[157]: 'wrapper'
Python中调用:
In [153]:
@decorator
def test():
return random.random()
In [154]:
def decorator(func):
def wrapper(*args,**kwargs):
return func()
return wrapper
In [155]:
f = decorator(test)
In [156]: test()
Out[156]: 0.4721355877472021
In [158]: test.__name__
Out[158]: 'wrapper'
保留3位有效数字
In [159]:
@decorator
def test():
return random.random()
In [160]:
def decorator(func):
def wrapper(*args,**kwargs):
# do something
return round(func(*args,**kwargs),3)
return wrapper
In [161]:
test()
Out[161]:
0.016931433361564663
保留2位有效数字
In [166]:
@decorator
def test():
return random.random()
@decorator
def test_two():
return random.random()
In [167]:
def decorator(func):
def wrapper(*args,**kwargs):
# do something
return round(func(*args,**kwargs),2)
return wrapper
In [168]: test()
Out[168]: 0.52
In [169]: test_two()
Out[169]: 0.08