内部函数
闭包:
闭包将内部函数自己的代码和作用域以及外部函数的作用结合起来。
闭包的词法变量不属于全局名字空间域或者局部的——而是属于其他的名字空间,带着流浪的作用域。
闭包对于安装计算,隐藏状态,以及在函数对象和作用域中随意的切换是很有用的。
闭包也是函数,但是他们能携带一些额外的作用域。
实例
装饰器
装饰器是在函数调用之上的修饰
这些修饰是当声明一个函数或者方法的时候,才会应用的额外调用
使用装饰器的情形有:
——引用日志
——增加计时逻辑来检测性能
——给函数加入事物的能力
装饰器实例1:设置验证函数,登录前调用登录验证函数
user_status = False #用户登录后就改变状态为True user_status = False
#用户登录后就改变状态为True
def login():
username = ‘zhangsan‘
password = ‘abc123‘
global user_status
if user_status == False:
username1 = input(‘请输入用户名:‘)
password1 = input(‘请输入密码:‘)
if username==username1 and password==password1:
user_status = True
print(‘用户登录成功!‘)
else:
print(‘用户名或密码错误!‘)
else:
print(‘用户已登录,验证通过……‘)
def home():
print(‘首页‘.center(20,‘-‘))
def america():
if login():#执行前加上验证
print(‘欧美专区‘.center(20,‘-‘))
def japan():
login()#执行前验证
print(‘日韩专区‘.center(20,‘-‘))
home()
america()
装饰器实例2:
编程原则:
封闭:已实现的功能代码块不应该被修改
开放:兑现有功能的扩展开放
user_status = False #用户登录后就改变状态为True def login(func): username = ‘zhangsan‘ password = ‘abc123‘ global user_status if user_status == False: username1 = input(‘请输入用户名:‘) password1 = input(‘请输入密码:‘) if username==username1 and password==password1: user_status = True print(‘用户登录成功!‘) else: print(‘用户名或密码错误!‘) elif user_status == True: func() def home(): print(‘首页‘.center(20,‘-‘)) def america(): print(‘欧美专区‘.center(20,‘-‘)) def japan(): print(‘日韩专区‘.center(20,‘-‘)) home() login(america) login(japan)
装饰器实例3
def login(func): def inner(): username = ‘zhangsan‘ password = ‘abc123‘ global user_status if user_status == False: username1 = input(‘请输入用户名:‘) password1 = input(‘请输入密码:‘) if username==username1 and password==password1: user_status = True print(‘用户登录成功!‘) else: print(‘用户名或密码错误!‘) if user_status == True: func() #如果验证通过,就能调用相应的功能 return inner def home(): print(‘首页‘.center(20,‘-‘)) def america(): print(‘欧美专区‘.center(20,‘-‘)) @login def japan(): print(‘日韩专区‘.center(20,‘-‘)) home() japan()
装饰器实例4 :带参数的函数
user_status = False #用户登录后就改变状态为True def login(func): def inner(*args, **kwargs): username = ‘zhangsan‘ password = ‘abc123‘ global user_status if user_status == False: username1 = input(‘请输入用户名:‘) password1 = input(‘请输入密码:‘) if username==username1 and password==password1: user_status = True print(‘用户登录成功!‘) else: print(‘用户名或密码错误!‘) if user_status == True: func(*args, **kwargs) #如果验证通过,就能调用相应的功能 return inner def home(): print(‘首页‘.center(20,‘-‘)) @login def america(): print(‘欧美专区‘.center(20,‘-‘)) @login def japan(style):#带参数 print(‘日韩专区‘.center(20,‘-‘)) home() japan(‘3p‘)#调用必须传参 america()
装饰器4:增加验证方法,多层嵌套
user_status = False #用户登录后就改变状态为True def login(auth_type): def auth(func):#把要执行的模块从这里传进来 def inner(*args, **kwargs): if auth_type==‘qq‘: username = ‘zhangsan‘ password = ‘abc123‘ global user_status if user_status == False: username1 = input(‘请输入用户名:‘) password1 = input(‘请输入密码:‘) if username==username1 and password==password1: user_status = True print(‘用户登录成功!‘) else: print(‘用户名或密码错误!‘) if user_status == True: return func(*args, **kwargs) #如果验证通过,就能调用相应的功能 else: print(‘only support qq‘) return inner return auth def home(): print(‘首页‘.center(20,‘-‘)) @login(‘qq‘) def america(): print(‘欧美专区‘.center(20,‘-‘)) @login(‘weibo‘) def japan(style):#带参数 print(‘日韩专区‘.center(20,‘-‘)) home() japan(‘3p‘)#调用必须传参 america()