- python函数嵌套 在工作中遇到了函数嵌套:即一个函数里面,再定义一个函数。为什么要在函数里再定义一个函数?这和装饰器有什么区别? 别急!来上代码:
def fun1(a):
def fun2(b):
c = a*b
print(c)
return fun2
fun2 = fun1(2)
fun2(3)
# fun1(2)(3)
一个函数在另外一个函数的里面,外层的函数返回的是里层函数。也就是函数本身被返回了,返回的是函数(就像C语言返回指向函数的指针一样)。
def fun1(a):
d = 5
def fun2(b):
res = a*b*d
print(res)
def fun3(c):
res = a**c-d
print(res)
return fun2,fun3
返回的函数还可以访问它的定义所在的作用域,也就是它带着它的环境信息。如fun2、fun3是可访问变量d的。
2.装饰器
其实,上面函数嵌套的最外层函数名字就是装饰器名称
def fun4(fun):
def fun5():
print("进入装饰器,准备修改函数")
fun()
print("修改函数完毕,准备离开装饰器")
return fun5
@ fun4
def fun():
print("我是将要被修改的函数")
fun()
print(fun.__name__)
output:fun5
# 此时fun函数的名字和注释文档(docstring)被重写了
当不希望函数名不被重写时,使用functiontool
from functiontool import wraps
def fun4(fun):
@wraps(fun)
def fun5():
print("进入装饰器,准备修改函数")
fun()
print("修改函数完毕,准备离开装饰器")
return fun5
@ fun4
def fun():
print("我是将要被修改的函数")
fun()
print(fun.__name__)
output:fun
@wraps(fun)装饰器像普通函数一样
def fun6(str = "abcde"):
def fun7(fun):
@wraps(fun)
def fun8():
print("进入装饰器,准备修改函数")
s = fun()
print(s+str)
print("修改函数完毕,准备离开装饰器")
return fun()
return fun8
return fun7
@fun6("我是新的参数")
def fun():
return "我是将要被修改的函数"
fun()
# 新参数传进去了