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'