Python 内嵌函数、闭包、装饰器浅析
Admin
2019-10-25 12:36:57
Python
Python 内嵌函数(返回式函数)、闭包、装饰器,共同之处都是以函数作为参数传递到函数,不同之处在于调用和返回的的区别。
内部函数
def func(num): def add(num): # 传入外部参数 return num + 1 return add(num) # 返回内嵌函数 >>> func(1) 2
内嵌函数引用外部传入参数,外部函数显示的返回是内部函数add的调用, 当需要在函数内部多次执行复杂任务时比较有用,避免重复代码。
闭包
内嵌函数也可看做是一个闭包, 闭包是一个可以由另一个函数动态生成的函数,且可以改变函数外变量的值。
def func(num): def add(): return num # 在内部函数引用传入参数 return add # 返回函数本身,不包含函数调用 >>> func(1) <function add at 0x10b38ac08> >>> func(1)() 1
装饰器
装饰器也是一个函数, 它把一个函数作为输入,并且返回另一个函数。
def func(func): # 函数作为参数传递 def add(*args, **kwargs): print "作用体" return func(*args, **kwargs) # 返回传递函数 return add def test(num): return num + 1 >>> func(test) # 传入test函数进行装饰 <function add at 0x10b38bde8> # 装饰后的函数,类似闭包 >>> func(test)(1) # 对装饰后的函数进行调用 作用体 2 @func # @ 同时可以调用多个装饰器,执行顺序不分先后 def test(num): return num + 1 # 无论 func 传入的是什么, 装饰器都会返回一个新的函数。只是在被装饰的函数前,执行或附加代码。
带参数的装饰器
def func(ss): # 传入参数 def execs(func): def add(*args, **kwargs): print "作用体, %s" %ss return func(*args, **kwargs) return add return execs >>> func("test") <function execs at 0x10b38bde8> >>> func("test")(test)(1) 作用体, test 2 @func("test") def test(num): return num + 1
注意: 对test进行装饰后,test的函数命名空间发生了变化
>>> test.__name__ 'add'
可以使用functools(是自带库)模块指向原来的命名空间
import functools def func(func): @functools.wraps(func) def add(*args, **kwargs): print "作用体" return func(*args, **kwargs) return add @func def test(num): return num + 1 >>> test.__name__ 'test'