python闭包函数及装饰器简介
2024-10-20 21:12:58
目录:
闭包函数简介
闭包函数的实际应用
装饰器简介
装饰器初期-完整版
- 装饰器语法糖
闭包函数简介
1.定义在函数内部的函数(函数的嵌套)
2.内部函数运用外部函数局部名称空间中的变量名
注:函数名还可以当做函数的返回值
如何接收返回值(统一语法):变量名 = 函数()
函数名也可以被用来多次赋值
def func(username):
# username = 'jason'
def name():
print(username)
return name
res = func('jason')
print(res)
res()
闭包函数的实际应用
1.给函数体代码传值方式
1.1 通过形参传值:在函数定义时定义形参,调用时临时绑定形参与实参完成传值
def func(username):
print(username)
func('jason') # jason
1.2 通过闭包函数传值:通过返回值内部函数函数名,通过接收返回值完成传值
def func(username):
def name():
print(username)
return name
res = func('jason')
res() # jason
res1 = func('kevin')
res1() # kevin装饰器简介
1.本质:不改变'内部代码'及'调用方式'添加新功能
2.原则:对修改封闭,对扩展开放
3.扩展知识:时间戳
3.1时间戳:截至目前至1970年1月1日0时0分0秒的秒数
import time
print(time.time()) # 1657008257.5792694
3.2可以统计代码运行的时间(打印0-1000所需秒数)
import time
start_time = time.time()
for i in range(0, 1000):
print(i)
end_time = time.time()
print('%s'%(end_time-start_time)) # 0.027039527893066406
3.3睡眠时间 time.sleep(2)括号里的数字代表几秒
import time
time.sleep(2)
print('快睡着了')装饰器初期-完整版
1.装饰器初期
1.1 缺陷:如果有多个func函数统计执行时间,则需要多次写代码(统计func函数的执行时间)
import time
def func():
time.sleep(2)
print('快睡着了')
start_time = time.time()
func()
end_time = time.time()
print(end_time-start_time) # 2.002647638320923
1.2 缺陷:只能统计func函数的执行时间,不能统计其他函数(将多次需要写的代码封装成函数)
import time
def func():
time.sleep(2)
print('快睡着了')
def get_time():
start_time = time.time()
func()
end_time = time.time()
print(end_time-start_time)
get_time() # 2.0140273571014404
get_time() # 2.008859157562256
1.3 定义的函数存在形参,调用时必须传实参(可以统计多个函数的执行时间)
import time
def func():
time.sleep(2)
print('快睡着了')
def username():
time.sleep(2)
print('他的名字是kevin')
def get_time(xxx):
start_time = time.time()
xxx()
end_time = time.time()
print(end_time-start_time)
get_time(func) # 快睡着了 2.005340099334717
get_time(username) # 他的名字是kevin 2.0011959075927734
注:暂无法解决
import time
def func1(a):
time.sleep(2)
print('我是存在形参的a')
def get_time(xxx):
start_time = time.time()
xxx(*args, **kwargs) # 暂无法解决
end_time = time.time()
print(end_time-start_time)
get_time(func)
get_time(username)
get_time(func1)
1.4 缺陷:调用函数名发生变化(解决办法:装饰器)
# 传值方式-参数传值不能改变调用函数方式
import time
def get_time(xxx):
start_time = time.time()
xxx()
end_time = time.time()
print(end_time-start_time)
get_time(func)
get_time(username)
# 传值方式-闭包函数(缺陷:只能计算func函数执行时间)
def func2():
xxx = func
def get_time():
start_time = time.time()
xxx()
end_time = time.time()
print(end_time-start_time)
return get_time
res = func2()
res() # 快睡着了 2.0147109031677246
1.5 所有函数执行时间(可以统计多个函数执行时间、不改变调用函数名,使用闭包函数)
import time
def func():
time.sleep(2)
print('快睡着了')
def username():
time.sleep(2)
print('他的名字是kevin')
def func2(xxx):
# xxx = func
def get_time():
start_time = time.time()
xxx()
end_time = time.time()
print(end_time-start_time)
return get_time
func = func2(func)
func() # 快睡着了 2.0079562664031982
username = func2(username)
username() # 他的名字是kevin 2.0015351772308352.装饰器优化版本(可以统计多个函数执行时间、并且有参无参都可以使用,不改变调用函数名,使用闭包函数)
import time
def func(xxx):
def get_time(*args, **kwargs): # 形参
start_time = time.time()
xxx(*args, **kwargs) # 实参
end_time = time.time()
print(end_time-start_time)
return get_time
func2 = func(func2)3.装饰器完整版本
import time
def func(xxx):
def get_time(*args, **kwargs): # 形参
start_time = time.time()
res = xxx(*args, **kwargs) # 实参
end_time = time.time()
print(end_time-start_time)
return res
return get_time4.装饰器最终版本
from functools import wraps
def outer(func_name):
@wraps(func_name) # 仅仅是为了让装饰器不容易被别人发现 做到真正的以假乱真
def inner(*args, **kwargs):
print('执行被装饰对象之前可以做的额外操作')
res = func_name(*args, **kwargs)
print('执行被装饰对象之后可以做的额外操作')
return res
return inner装饰器语法糖
import time
@outer # home = outer(真正的函数名home)
def home():
'''我是home函数 我要热死了!!!'''
time.sleep(1)
print('from home')
return 'home返回值'
最新文章
- jquery mobile 登陆后页面验证
- 创建一个.bat文件,用于打开某个路径下的文件
- hadoop自带的writable类型
- sqlserver检测数据库是否能连接的小技巧
- webpack 的使用2
- A session had already been started – ignoring session_start() 怎么办?
- c++ 之模板进阶
- 《剑指offer》平衡二叉树
- @vue/cli 3 打包文件读取绝对路径处理
- 转 利用java反射实现两个具有相同属性bean赋值
- 09.vue中样式-style
- CF1114E Arithmetic Progression(交互题,二分,随机算法)
- Shiro笔记(五)JSP标签
- Add task bar to ubuntu
- Oracle性能优化1-总体思路和误区
- Android onActivityResult和setResult
- ★ java删除代码注释
- vscode中的vue文件中emmet进行tab键不起作用
- SSM框架——实现分页和搜索分页
- webstorm自动压缩js、css、html【工具篇】