1、 内部函数 ,顾名思义,是函数内部定义的函数,其作用是封装逻辑,使函数逻辑更为清晰。
def outer():
inner():
业务逻辑
return inner
2、 为何return inner而不是return inner()呢?
初学者可能都有此一问,我们知道,运行一个函数就是:func(),然后func会得出结果。同理,如果return inner()就是要返回inner()的运算结果,但是innner()函数没有返回值,此时return inner()只能得到None。而retrun inner是返回inner这个函数,并不会运行这个函数。
总结:
return innner返回函数逻辑代码,不运行函数
return inner()运行inner函数,将函数结果返回
3、 装饰器
装饰器用到的就是内部函数。如下,若把需要装饰的函数称之为目标函数,定义装饰器decorator,把目标函数作为参数传给decorator函数,然后定义内部函数wrapper,wapper用于包装目标函数,包装完毕后将wrappper函数返回。
由此,可以看出,decorator函数只是返回wrapper的逻辑代码,并不会运行wrapper
def decorator(func):
def wrapper():
print('start')
func()
print('end')
return wrapper()
@decorator
def myfunc():
print('run')
myfunc()
上述代码就是将myfunc函数作为参数传递给decorator函数,然后decorator函数中的内部函数wrapper函数调用了myfunc函数,并对其进行了简单包装,最后直接把wrapper中的逻辑返回。
运行结果:
若需要加参数,如下:
def log(text):
def deco(func):
def wrapper(*args,**kw):
print text
func(*args,**kw)
print text + " again"
return wrapper
return deco
@log("hello")
def myfun(message):
print message
myfun("world")
# 运行结果
# hello
# world
# hello again
4、 闭包
上面的wrapper函数就是闭包,闭包就是内部函数的一种。
具体可参考https://www.cnblogs.com/Lin-Yi/p/7305364.html
5、 Nonetype报错
初学者在利用装饰器时,可能会碰上这个报错,何也?
其实是因为装饰器返回不当,装饰器本来应该返回一个函数,但是却没有返回,会引发此错误。检查代码,看看是否return语句嵌套不当,即可解决。