函数进阶
1.闭包函数
什么是闭包函数
函数内部函数对外部作用域而非全局作用域的引用
def outer(): x=1 def inner(): print (x) return inner 举例: import requests def outer(url): def get(): reponse=requests.get(url) print (reponse.text) return get baidu=outer("http://www.baidu.com") baidu()
2.装饰器
什么是装饰器
- 装饰器就是在不改变被装饰函数的源代码,不改变被装饰函数的调用方式的基础上,为被装饰函数增加新功能
- 装饰器本身也是一个函数,它用来装饰被装饰的函数
- 装饰器装饰函数,不改变被装饰函数的源代码
- 装饰器装饰函数,不改变被装饰函数的调用方式
装饰器模板
def deco(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper
装饰器函数举例1
#写一个统计时间的装饰器函数 def deco(func): def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print (stop-start) return res return wrapper @deco def index(): time.sleep(2) print ("index") index()
装饰器函数举例2
import time #写一个统计时间的装饰器函数,加上登录装饰器 def deco(func): def wrapper(*args,**kwargs): username=input("name---->:") passwd=input("passwd-==>:") if username=='yqliu' and passwd=='123': print ("登录成功,开始执行函数") start = time.time() res = func(*args, **kwargs) stop = time.time() print(stop - start) else: print ("用户名密码错误") return return res return wrapper @deco def index(): time.sleep(2) print ("index") index() @deco def home(name): time.sleep(3) print (name) home("yqliu")
三层装饰器
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)