闭包与装饰器

闭包

内外函数嵌套,内函数引用外函数作用域下的 非 全局变量,外部函数返回内部函数的对象
优点: 为变量续命 缺点: 浪费内存

# 内外函数嵌套
def outer(a, b):
    def inner():

# 内部函数引用外部函数作用域下的非全局变量
        print(a + b)
        
# 外函数返回内函数对象
    return inner
outer(5, 9)()
def f1(n):
    def f2():
        list1 = [i for i in range(1, n+1)]
        print(list1)
    return f2
f1(9)()

装饰器

在不改变原函数的情况下,对已有函数进行额外的功能扩展。
不修改已有函数的源代码调用方式 给已有函数增加新功能

闭包与装饰器的区别:装饰器实质上是一个闭包函数,但是装饰器的参数有且只有一个并且是函数类型的时候,他才是装饰器,否则就是闭包

# 用闭包的思路实现 计算程序使用时间 print("今天天气好晴朗")
import time

def outer(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print(end - start-1)
    return inner

@outer  #调用 装饰器outer
def func():  # func 传入装饰器的参数 f
    print("今天天气好晴朗")
    time.sleep(1)

func() # 等同于innr()

通用装饰器

#内函数与被装饰的函数保持一致{参数一致,返回一致}
#定义一个装饰器,给程序增加 print("正在努力执行加法运算") 程序功能 通过传参实现几数相加
def outer(f):
    def inner(*args):
        print("正在努力执行加法运算")
        f(*args)
    return inner

@outer
def f1(*args):
    print(sum(args))
f1(5, 9, 9, 45, 34)
#定义一个装饰器 给程序中的话添加<p> </p>
def outer(f):
    def inner():
        return "<p>" + f() + "</p>"
    return inner

@outer
def func():
    return "人生苦短,我用python"
print(func())

多层装饰器

#第一层装饰器装饰的是 第二层装饰器装饰过的
#第一个装饰器
def outer(f):
    def inner():
        print("这是装饰器1执行的开始")
        f()
        print("这是装饰器1执行的结束")
    return inner
#第二个装饰器
def outer2(f):
    def inner2():
        print("这是装饰器2执行的开始")
        f()
        print("这是装饰器2执行的结束")
    return inner2

@outer
@outer2
def func():
    print("人生苦短,我用python")
func()

执行结果============>
这是装饰器1执行的开始
这是装饰器2执行的开始
人生苦短,我用python
这是装饰器2执行的结束
这是装饰器1执行的结束
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值