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,闭包,装饰器
0
投稿

猜你喜欢

  • 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
  • MySQL密码正确却无法本地登录-1045

    2024-01-24 12:04:04
  • 网页栅格系统研究:蛋糕的切法

    2008-10-24 17:07:00
  • Windows下MySQL 8.0.29 安装和删除图文教程

    2024-01-21 20:18:29
  • 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
  • 如何利用Python解析超大的json数据(GB级别)

    2023-03-22 12:08:21
  • Python模块汇总(常用第三方库)

    2023-05-21 16:25:37
  • Vue Echarts实现柱形图从右向左滚动效果

    2023-07-02 16:59:19
  • 关于Vue的URL转跳与参数传递方式

    2024-05-09 09:06:02
  • SQLServer 快速备份的十种方法

    2024-01-21 01:04:32
  • 如何创建SQL Server 2000故障转移群集

    2024-01-23 17:00:23
  • asp之家 网络编程 m.aspxhome.com