Python的闭包和装饰器你真的了解吗
作者:尤诺. 时间:2023-04-24 00:18:05
闭包
闭包就是能够读取其他函数内部变量的函数。
def test1(k, b):
def test1_1(x):
print(k*x+b)
return test1_1
t1 = test1(1, 2)
t1(0)
t1(1)
t1(2)
闭包中修改数据
x = 300
def test1():
x = 200
def test2():
nonlocal x
print("----1----x = {}".format(x))
x = 100
print("----2----x = {}".format(x))
return test2
t1 = test1()
t1()
装饰器
实现对无参数函数的装饰器
def set_func(func):
def call_func():
print("装饰器执行")
func()
return call_func
@set_func # 等价于sumNum = set_func(sumNum)
def sumNum():
print("sumNum")
sumNum()
实现对有参数函数的装饰器
# 对有参数、无返回值的函数进行装饰
def set_func(func):
def call_func(num):
print("装饰器")
func(num)
return call_func
@set_func
def sumNum(num):
print("sumNum = {}".format(num))
sumNum(100)
对不定长参数的函数进行装饰
def set_func(func):
def call_func(*args, **kwargs):
print("装饰器")
func(*args, **kwargs) # 拆包
return call_func
@set_func
def sumNum(num, *args, **kwargs):
print("sumNum = {}".format(num))
print("args = {}".format(args))
print("kwargs = {}".format(kwargs))
sumNum(100, 200, c=100)
对有返回值的函数进行装饰
def set_func(func):
def call_func(*args, **kwargs):
print("装饰器")
return func(*args, **kwargs) # 拆包
return call_func
@set_func
def sumNum(num, *args, **kwargs):
print("sumNum = {}".format(num))
print("args = {}".format(args))
print("kwargs = {}".format(kwargs))
return "200 ok"
sumNum(100, 200, c=100)
多个装饰器对同一个函数装饰
def add_h1(func):
def h1():
h1_str = "<h1>" + func() + "</h1>"
return h1_str
return h1
def add_a(func):
def call_func():
a_str = "<a>" + func() + "</a>"
return a_str
return call_func
@add_h1
@add_a
def get_str():
return "haha"
get_str()
输出为:<h1><a>haha</a></h1>
来源:https://blog.csdn.net/weixin_43670190/article/details/122916070
标签:Python,闭包,装饰器
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
nodejs中的读取文件fs与文件路径path解析
2024-05-08 09:36:25
微信小程序上传图片到php服务器的方法
2023-11-07 11:57:25
如何利用JS将手机号中间四位变成*号
2024-02-23 20:07:51
一篇文章看懂SQL中的开窗函数
2024-01-16 07:22:05
![](https://img.aspxhome.com/file/2023/0/113980_0s.jpg)
MySQL密码正确却无法本地登录-1045
2024-01-24 12:04:04
网页栅格系统研究:蛋糕的切法
2008-10-24 17:07:00
![](https://img.aspxhome.com/file/UploadPic/200810/24/20081024171957433s.jpg)
Windows下MySQL 8.0.29 安装和删除图文教程
2024-01-21 20:18:29
![](https://img.aspxhome.com/file/2023/8/109798_0s.jpg)
Javascript学习笔记之数组的遍历和 length 属性
2024-04-18 10:53:43
如何检测Oracle的ODBC是否连接成功?
2009-11-24 20:31:00
python return逻辑判断表达式实现解析
2023-04-05 08:03:10
Python错误+异常+模块总结
2023-07-26 03:18:19
精巧支付宝导航条制作教程
2010-03-20 21:25:00
Python MySQL进行数据库表变更和查询
2024-01-17 04:35:24
js实现向右横向滑出的二级菜单效果
2024-04-17 10:34:44
![](https://img.aspxhome.com/file/2023/9/136229_0s.jpg)
如何利用Python解析超大的json数据(GB级别)
2023-03-22 12:08:21
![](https://img.aspxhome.com/file/2023/9/135069_0s.jpg)
Python模块汇总(常用第三方库)
2023-05-21 16:25:37
![](https://img.aspxhome.com/file/2023/4/91864_0s.png)
Vue Echarts实现柱形图从右向左滚动效果
2023-07-02 16:59:19
![](https://img.aspxhome.com/file/2023/1/139871_0s.gif)
关于Vue的URL转跳与参数传递方式
2024-05-09 09:06:02
![](https://img.aspxhome.com/file/2023/3/128883_0s.png)
SQLServer 快速备份的十种方法
2024-01-21 01:04:32
如何创建SQL Server 2000故障转移群集
2024-01-23 17:00:23