python装饰品和闭包的关系_python的闭包及装饰器

闭包:

闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体

1、函数是一个对象

2、函数执行完成后内部变量回收

3、函数属性

4、函数的返回值

实例一、

分别检测分数科目总分为100、150两种情况的成绩

初级代码如下:

执行结果如下:

使用闭包优化后的代码:

执行结果:

Tips:

可以看代码量少了一半;

闭包就是我们内置函数对 enclosing 作用域  变量  的使用

实例二、

执行结果:

发现上述代码不够健壮,如果你传入字符串或空的列表就会报错

修改代码,进行检查传入数据的类型及长度

执行结果:

健壮性是可以了,不过发现其中有一部门代码是重复的,但是执行的 函数 又是不同的,分别为 my_sum 、my_average

使用闭包优化后的代码:

执行结果:

装饰器:

1、用来装饰函数

2、返回一个新的函数对象

3、被装饰函数标识符指向返回的函数对象

4、语法糖: @deco

上述闭包的例子,in_dec 被 dec 所装饰,那可以说装饰器其实就是闭包的一个本质使用

为了演示 装饰器 的功能,以上述代码为例,进行 装饰器 写法

所以没有显示调用,但是执行以下:

结果证明 调用 了 dec 函数,那应该是 装饰器语法糖 @dec 时进行了调用,但是它返回了一个函数,那被谁接受了呢? 是被他装饰的 my_sum 接受了。

为了证明,来调用下 my_sum

结果:

证明是对的;

@dec 相当于上述的

也就可以认为 被重新赋值的 my_sum 相当于装饰器 dec 的内部函数 in_dec

装饰器 dec 的参数 func 相当于 被修饰的函数 my_sum

装饰器 实例二、

执行结果:

可以看到这里的 test_dec 是 NoneType类型,无法调用,那是因为我们在装饰器函数没有进行显示的 return ,python 默认返回 None,

所以装饰器函数必须显示的进行 return in_func (这里为 return in_dec)

修改后 执行

上面提到了(红字)函数间的关系(相当于对象引用关系),那赋值的被修饰函数的 参数 就必须三个函数都对应起来

执行结果:

本文转自 西索oO 51CTO博客,原文链接:http://blog.51cto.com/lansgg/1884913

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值