函数进阶
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)