作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关
闭包概念:
外部函数包了一个内部函数,内部函数用的外部函数的变量,并且返回一个包含了外部作用域而非全局作用域的变量,我们就称这个内部函数为闭包。
情况一:
def outer(f):
def inner():
print(f)
return inner
really_inner = outer(10)
really_inner()
内部函数用的是外部函数的变量f
情况二:
n=10
def outer(arg):
def inner():
print(arg)
return inner()
f=outer(n)
print(f)
将n的值传给arg,里面函数用的是arg这个变量,不是n
简单理解装饰器
就像一个自己定义的模块,里面定义某几种功能,当某个函数想要实现这些功能时,在函数前@装饰器里的外部函数名称,就会参数传递(这个参数有时候会是某个函数)
def n():
print("welcome")
def outer(arg):
def inner():
print("*"*20)
arg()
print("*"*20)
return inner
n = outer(n)
n()

装饰器的一般模板
def auth(func):
def wrapper(*args, **kwargs):
# 写需要增加的功能的代码
r = func(*args, **kwargs)
return r
return wrapper
例子
# 被装饰的函数
def echo(msg):
print(f"千锋教育{msg}欢迎您!")
# 装饰器
def outer(arg):
def inner(*args,**kwargs):
print("*" * 20)
arg(*args,**kwargs)
print("*" * 20)
return inner
echo = outer(echo)
echo('云计算')
@outer
def show(g):
print(f"{g} is good")
********************
千锋教育云计算欢迎您!
********************
装饰器最常见用途,验证用户登录
user_info = {'name':'wgy','pwd':'123'}
user_list=[]
def auth_login(func):
def wrapper(*args,**kwargs):
inp_user = input("用户名").strip()
inp_pwd = input("密码").strip()
user = False
if inp_user == user_info['name'] and inp_pwd == user_info['pwd']:
user_list.append(inp_user)
user=user_info['name']
elif inp_user in user_list and inp_pwd in user_list:
func(*args,**kwargs)
if user :
func(*args,**kwargs)
else:
print("error")
return wrapper
def shouye():
print("this is shouye")
@auth_login
def user_center():
print(user_list)
print("this is user center")
def exit():
import os
os._exit(0)
def main():
while 1:
print("""
1.go to shouye
2.go to user center
3.login
q.exit
""")
choice = input(">>please input your choice:")
if choice =='1':
shouye()
elif choice=='3':
user_center()
elif choice=='2':
if len(user_list)==1:
print("this is user center")
else:
print("please login first!")
elif choice=='q':
exit()
if __name__=="__main__":
main()
网友评论