闭包和装饰模式,语法糖

本文深入探讨了Python中函数的定义方式、引用方法及调用过程,并通过具体实例介绍了闭包、装饰器等高级特性及其应用。文章还展示了如何使用装饰器简化代码并提供了语法糖的使用案例。
#函数的定义,引用,调用
# def func(a,b):  #定义
#     print (a+b)
# add = func  #引用
# add(1,4)#被执行,调用
# func(4,6) #调用
#
# def func(a,b):
#     return a+b
# add1 = func(5,6)#调用func()函数,将函数的返回值赋值给add1,add1不能被调用,它引用了函数的返回值
# add2 = func    #将对象赋值给add2                          add2可以被调用,它引用了func对象本身
# print(add2(1,2))#被执行
# print(func(3,4))
# print(callable(add1))
# print(callable(add2))


#闭包
# def funX(x):
#     print('开始-------')
#     def funY(y):
#         print('funY---------')
#         return x*y
#     print('结束---------')
#     return funY
# print(funX(3)(5))
# m = funX(2)
# print(m(4))

#装饰器
def diguo():
    print('底锅50')
    return 50
def shucai(x):
    print('蔬菜10')
    def funX():
        return 10 + x()
    return funX
def yangrou(y):
    print('羊肉40')
    def funY():
        return 40 + y()
    return funY
result = yangrou(shucai(diguo))
print(result())
#语法糖
@yangrou
@yangrou
@shucai
def diguo():
    print('底锅50')
    return 50
diguo()





### Python 中闭包装饰器的区别 #### 闭包的概念 闭包是指一个函数对象能够记住并访问它的词法作用域,即使这个函数在其词法作用域之外被调用。简单来说,当内部函数引用了外部函数的局部变量时,就形成了闭包。 ```python def outer(x): a = 300 def inner(): print(f"两数之 {x + a}") return inner d = outer(10) d() ``` 在这个例子中 `outer` 函数返回了一个名为 `inner` 的函数,在此之后即便 `outer` 已经结束执行,`inner` 还是可以访问到 `a` 参数 `x`[^2]。 #### 装饰器的作用机制 装饰器本质上是一个接受其他函数作为参数的高阶函数,并且通常会定义一个新的函数来增强原始行为或者修改其输入输出。通过语法糖 `@decorator_name` 可以简化对目标函数应用装饰的过程。 ```python def make_d(func): def inner(): res = "<div>" + func() + "</div>" return res return inner def make_p(func): def inner(): res = "<p>" + func() + "</p>" return res return inner @make_d @make_p def content(): return "人生苦短,我用Python" res = content() print(res) ``` 这里展示了如何利用多个装饰器依次包裹住原函数 `content()` ,最终实现了 HTML 标签嵌套的效果[^3]。 #### 关键差异点总结 - **功能定位不同**:闭包主要用于保存状态以及实现数据隐藏;而装饰器则侧重于动态地向已有代码注入额外的功能逻辑。 - **结构形式各异**:闭包由外层函数创建内层函数构成;装饰器则是基于更高层次上的组合模式设计而成。 - **应用场景有别**:闭包常用于构建回调函数、缓存计算结果等场景;装饰器更多应用于日志记录、权限验证等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值