闭包函数
闭包函数的定义
闭:在函数的内部定义函数,至少定义两层函数
包:内部的函数使用外部的函数名称空间中的名字
# 使用场景:闭包函数是第二种传参的方式,一次传参,多次调用
装饰器
装饰器的核心思想:在不改变被装饰对象内部代码和原有的调用方式基础之上在添加额外的功能
统计函数的执行时间
#时间模块 import time def outer(func): def get_time(): #函数执行之前的时间点 start_time = time.time func() #函数执行之后的时间点 end_time = time.time print('函数执行了%秒' % (end_time - start_time)) return get_time def index(): time.sleep(2) print('from index') index = get_time(index) index()
有参数版本
import time def outer(func): def get_time(*args, **kwargs) start_time = time.time() func(*args,**kwargs) end_time = time.time print('函数执行了%秒' % (end_time - start_time)) return get_time def index(): time.sleep(2) print('from index') index = outer(index) index()
有返回值版本
import time def outer(func): def get_time(*args, **kwargs): start_time = time.time func(*args, **kwargs) end_time = time.time res =end_time -start_time return res return get_time def index(): time.sleep(2) print('from index') index = outer(index) index()
登录认证功能
def login_auth(func): def auth(*args, **kwargs): #登录功能 username = input('username:').strip() password = input('password:').strip() #判断 用户名和密码是否正确 if username == 'kevin' and password =='123' print('登录成功') res = func(*args, **kwargs) return res else: print('用户名或密码错误') return auth @login_auth def index(): print('from index')
装饰器的固定模版(语法糖)
def outer(func): def inner(*args, **kwargs): # 函数执行之前可以添加的功能 res = func(*args, **kwargs) #函数执行之后可以添加的功能 return res return inner @outer def index(): pass index()
双层语法糖
双重语法糖从下往上走、多重语法糖也是一样的道理,最后都是index = 最上层修饰器(下一层修饰器内部函数)
def a(func): print('a') def inner_a(*args, **kwargs): print('inner_a') res = func(*args, **kwargs) # 4.inner_b = func 调用inner_b return res return inner_a def b(func): print('b') def inner_b(*args, **kwargs): print('inner_b') res = func(*args, **kwargs) # 5.index = func 调用 index return res return inner_b @a # 2. index = a(inner_b) @b # 1. inner_b = b(ineer_b) def index(): pass index() # 3. inner_a = a(inner_b) 调用inner_a
装饰器修复技术
确保被装饰函数不会因为装饰器带来异常问题
from functools import wraps # 提出 def a(func): print('a') @wraps(func) # 装饰 def inner_a(*args, **kwargs): print('inner_a') res = func(*args, **kwargs) return res return inner_a @a def index(): pass index()
有参装饰器
def outer(source_data,a,b, *argssss, **kwargsssss): # source_data = 'file' def login_auth(func): def auth(*args, **kwargs): # source_data = args[0] if source_data == 'file': # 来自于文件 elif source_data == 'mysql': # 来自于mysql elif source_data == 'oracle': # 来自于oracle if username =='kevin' and password == '123': print('成功') func() else: print('失败') return auth return login_auth # @login_auth # index=login_auth(index) @outer('file'1,2) def index(): pass index('file')
标签:index,return,inner,func,time,装饰,def From: https://www.cnblogs.com/Lucky-Hua/p/17458159.html