global与nonlocal
global:在局部声明变量是全局变量
x=1
def func():
global x
x=2
func()
print(x)
在没有写global x 时,输出的x时1,因为x已经被定义好了,而global x将局部变量变成的全局变量,所以加了之后的输出结果为2
nonlocal:在局部声明变量时外层函数的变量
def
make_counter():
count
=
0
def
counter():
nonlocal count
count
+
=
1
return
count
return
counter
def
make_counter_test():
mc
=
make_counter()
print
(mc())
print
(mc())
print
(mc())
make_counter_test()
如果不屑nonlocal count 那么程序会报错,因为count已经被外层定义,如果写了nonlocal count 那么最后输出的结果为 1,2,3
装饰器
1什么时装饰器
指的时为被装饰对象添加新功能的工具
装饰器本身可以是任意可调用的对象、函数
被装饰的对象也可以是任意可调用的对象、函数
2为何要用装饰器
开放封闭原则:软件一旦上线就应该对修改封闭,对扩展开放
对修改封闭:
1.不能修改功能的源代码
2.也不能修改功能的调用方式
对扩展开发:
可以为原有的功能添加新的功能
装饰器就是在不改动功能源代码以及调用方式的前提下为原功能添加额外新的功能
@装饰器的名字:要在被装饰对象正上方单独一行写上
无参装饰器的模板
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
# 有参装饰器
def outter2(xxx,yyy):
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
print(xxx)
print(yyy)
return res
return wrapper
return outter