函数的进阶:
闭包函数
闭包函数把闭包函数内部的变量+闭包函数内部的函数这两者包裹在一起,然后通过返回值的形式返回出来。这样,就能在全局进行对闭包函数内部的函数的调用
闭包函数至少得符合函数的嵌套
def f1(url):#f1就是闭包函数
def spider():
print(url)
return spider
taobao=f1('www.taobao.com')
taobao()
装饰器
二层装饰器
装饰器就是对闭包函数的高级应用
装饰器的性质和特点:
装饰器的本质就是一个函数
装饰器的功能就是给被装饰的函数增加功能,增加功能必须满足以下两点
不改变被装饰函数的代码
不改变被装饰函数的调用方式
import time
username_list = []
def log_deco(index): # 这里的index才是真正的index
''' 装饰器'''
def wrapper(*args, **kwargs): # jieshou suoyou canshu
# username_inp,password_inp=index(*args,**kwargs)#打散参数传给真的index
username_inp = input("请输入账号")
password_inp = input("请输入密码")
print('欢迎来到登陆系统')
if username_list:
print("你已经登陆了哦,别再登陆了")
res = index(*args, **kwargs)
return res
with open('userinfo.txt', 'r', encoding='utf8')as fr:
for user_info in fr:
user_info = user_info.strip()
username, password = user_info.split(':')
if username_inp == username and password_inp == password:
print("登陆中", end="")
for i in range(5):
print(".", end='')
time.sleep(0.2)
print(".")
print('成功登陆')
username_list.append(username)
print(username_list)
res = index(*args, **kwargs)
return res
else:
print("失败了")
# return res
return wrapper
@log_deco
def index():
'''被装饰的函数'''
print('index')
time.sleep(1)
return 'index'
# index = log_deco(index) # index==f1
while True:
index()
三层装饰器
就是在双层的外面再加一层函数
在下面再return 一次第二层函数
三层装饰器实现了向装饰器中传参事物功能
username_list = []
def sanceng(role):
def login_deco(func):
def wrapper(*args, **kwargs):
if username_list:
print('已经登录,请勿重复登录')
res = func(*args, **kwargs)
return res
username_inp = input('请输入用户名:')
pwd_inp = input('请输入密码:')
with open(f'{role}_info.txt', 'r', encoding='utf8') as fr:
for user_info in fr:
username, pwd = user_info.strip().split(':')
if username_inp == username and pwd_inp == pwd:
print('登录成功')
username_list.append(username)
res = func(*args, **kwargs)
return res
else:
print('登录失败')
return wrapper
return login_deco
@sanceng('admin')
def index(x, y):
print('index')
print('x,y', x, y)
return 123
res = index(10, 20)
装饰器的模板
# 二层装饰器模板
def deco(func):
def wrapper(*args, **kwargs):
# 要加什么功能就加上去
res = func(*args, **kwargs)
return res
return wrapper