Python Day13:开放封闭原则、函数装饰器、全局局部变量
## 函数的嵌套定义 ```python 在一个函数的内部定义另一个函数 为什么要有函数的嵌套定义: 函数fn2想直接使用fn1函数的局部变量,可以将fn2直接定义到fn1内部,这样fn2就可以直接访问fn1的变量了 函数fn2的名字就变成fn1的局部变量了,正常只能在fn1中使用,想要在外部使用,可以将fn2的函数对象作为fn1函数的返回值 在外部也用同名的变量fn2来接受fn1函数的执行结果(fn1函数的返回值),那么fn2也就可以被外部调用了 ``` ## global关键字 ```python 作用:将局部变量提升为全局变量 1,全局没有同名变量,直接提升局部变量为全局变量 2,有同名的全局变量,就统一全局与局部变量的同名变量 如果局部变量想改变全局变量的值(发生地址变化),可以使用global来声明该变量 ``` ## nonlocal关键字 ```python 作用:将局部变量提升为嵌套局部变量 1,必须有同名的嵌套局部变量,就是同一嵌套局部变量与局部的同名变量。如果局部想改变嵌套局部变量的值,可以用nonlocal声明该变量 ``` ## 开放封闭原则 ```python 开放封闭原则:在不修改源代码与调用方式情况下为函数添加新功能 开发:拓展功能 封闭:不能修改源代码、不能修改调用方式 ``` ## 装饰器 ```python 装饰器:满足开发封闭原则的一个闭包应用 @outer语法调用outer,规定传入被装饰的函数对象,所以参数固化为一个,接受被装饰的函数对象. def outer(func): def inner(*args,**kwargs):(不能确定被装饰函数参数个数) pass#新功能,调用被装饰函数之前执行 res=func(*args,**kwargs)#调用接受被装饰函数返回 值) pass#新功能,调用被装饰函数之后执行 return res#被嵌套函数inner返回被装饰函数的返回值 return inner#装饰器的壳体返回内部inner函数对象 装饰器 outer 得到的新功能 inner 用被装饰的函数名去接受被装饰的执行结果,调用装饰器时传入被装饰的函数对象 @outer #fn=outer(fn)=inner #表面感觉调用的是原函数,本质调用的是闭包(inner),使用fn调用和fn定义及inner需要参数统一 fn() ``` ## 一个函数被多次装饰: ```python def outer (func): def inner(*args,**kwargs): pass #新功能 res=func(*args,**kwargs) pass#新功能 return res return inner def formt_return(func): def inner(*args,**kwargs): res=func(*args,**kwargs): if res: return "登录成功" return "登录失败" return inner def check_user(func): def inner (*args,**kwargs): user=arg[0]#新加 账号验证功能 if not(user.isalpha()and len(user)>=3): print("账号不合法") return False1 res=func(*args,**kwargs) return res return inner def check_pwd(func): def innner(*args,**kwargs): pwd=args[1]#密码验证功能 if len(pwd)<3: print("密码不合法") return False2 res=func(*args,**kwargs) return res return inner @formt_return @check_user @check_pwd def login(user,pwd): if user=="Mecal" and pwd=="123": return True return False0 user=input("请输入") pwd=input("请输入密码") res=login(user,pwd) print(res) ```