闭包
def A(num):
def incr(num1):
return num+num1
return incr
if __name__ == '__main':
a = A(4)
print(a(5))
incr和num1是闭包
def line_conf(a, b):
def line(x):
return a*x+b
if __name__ == '__main__':
a = line_conf(1,1)
b = line_conf(4,5)
print(a(5))
print(b(5))
a,b是y=x+1、y=4x+5,得到不同直线表达函数,闭包提高了代码复用性。
装饰器
func,表示是函数,指向定义的函数;func(),表示执行该函数。
装饰器是python遵循开放封闭
原则。该原则适用面向对象和函数式编程。
开放:扩展开发
封闭:已实现功能代码块
装饰器
:@函数名 == 函数名(另一函数)
装饰器功能
decorator
:
- 引入日志
- 函数执行时间统计
- 执行函数前预备功能
- 执行函数后清理功能
- 权限校验等场景
- 缓存
装饰器示例
无参数的函数
被装饰的函数有参数
被装饰的函数有不定长参数
装饰器中的return
装饰器带参数,在原有装饰器的基础上,设置外部变量
类装饰器-__call__
global、nonlocal
函数内部使用与全局变量同名变量,不修则是全局变量,修就是局部变量
global关键字修饰函数局部变量后标志是全局变量
嵌套函数和函数存在与全局变量同名变量,使用但不修都为全局变量;
函数修改变量值,被标识为该函数的局部变量,嵌套使用的该函数的局部变量;
嵌套函数修改变量值,被标识为该嵌套函数的局部变量,嵌套的修改不影响函数中同名函数和全局变量。
global可以在任何地方修饰变量;nonlocal只能在嵌套函数中,且该变量是嵌套函数的函数中的同名变量,两者不能同时在同一函数中
如果在函数中使用global修饰了变量,那么在嵌套函数中用nonlocal修饰同名变量会发生报错,因为nonlocal表示该变量在函数中已经定义,但检查时因为同名变量被global修饰为全局变量,所以不存在同名的局部变量,从而导致错误。
def A(num):
num += 1
print(num)
def incr(num1):
nonlocal num
num = 9
print(num)
return num+num1
return incr
if __name__ == '__main':
a = A(4)
print(a(5))