Python装饰器和闭包

1. 闭包

闭包的定义:

  • 存在函数嵌套
  • 内部函数使用外部函数的变量
  • 外部函数返回了内部函数

闭包的作用:内部函数保存外部函数的变量,提高代码的重用性。

示例代码

# 定义一个外部函数
def out(n1):
    # 定义一个内部函数
    def inner(n2):
        # 内部函数使用了外部函数的变量(n1)
        res = n1 + n2
        print("结果是:",res)
    # 外部函数返回了内部函数,这里返回的内部函数就是闭包
    return inner

# 创建闭包实例
f = out(1)
# 执行闭包
f(2)
f(3)

说明:内部函数inner保留了外部函数out的变量:n1,每次执行闭包都是在n1 = 1 基础上进行计算。若修改闭包内使用的外部变量则使用关键字nonlocal 

2. 装饰器

装饰器的作用:给已有函数增加额外功能的函数,它本质上就是一个闭包函数

装饰器的功能特点:

  • 不修改已有函数的源代码
  • 不修改已有函数的调用方式
  • 给已有函数增加额外的功能

通用装饰器的语法格式: 

# 通用装饰器
def logging(fn):
  def inner(*args, **kwargs):
      print("--正在努力计算--")
      result = fn(*args, **kwargs)
      return result

  return inner

实例1  装饰器实现已有函数执行时间的统计

import time

# 装饰器函数
def get_time(func):
    def inner():
        begin = time.time()
        func()
        end = time.time()
        print("函数执行花费%f" % (end-begin))
    return inner


@get_time
def func1():
    for i in range(100000):
        print(i)


func1()

 执行结果:

...
99995
99996
99997
99998
99999
函数执行花费0.329066

实例2   装饰带有参数的函数

# 添加输出日志的功能
def logging(fn):
    def inner(num1, num2):
        print("--正在努力计算--")
        fn(num1, num2)

    return inner


# 使用装饰器装饰函数
@logging
def sum_num(a, b):
    result = a + b
    print(result)


sum_num(1, 2)

 运行结果:

--正在努力计算--
3

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大帅不是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值