Python函数嵌套

257 阅读2分钟
  1. 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()
# 新参数传进去了