闭包:
闭包(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