闭包的演变过程:
优点:比全局变量的方式好在:k, b是函数line_4的一部分 而不是全局变量,
因为全局变量可以任意的被其他函数所修改
缺点:如果要计算多条线上的y值,那么需要在调用的时候进行传递参数,麻烦
"闭包"的本质就是函数的嵌套定义,即在函数内部再定义函数
"闭包"有两种不同的方式,第一种是"返回一个函数的名称",第二种是在函数内部"直接调用",本质上是一样
闭包的定义:
在一个外函数中定义一个内函数,内函数里运用了外函数的临时变量,
并且外函数的返回值是内函数的引用,这样就构成了一个闭包
闭包的三要素:
1、函数的嵌套
2、内层函数使用外层函数的变量
3、外层函数返回内层函数的引用
返回函数名称:
函数内部"直接调用":
闭包总结:
为什么存在闭包:
1、能够让临时变量长期存在
2、比面向对象节约资源
闭包的三要素:
1、函数的嵌套
2、内层函数使用外层函数的变量
3、外层函数返回内层函数的引用
装饰器的引入:
银行取钱:
装饰器的作用:
在不改=改变原有代码的基础上,添加额外的功能。
语法糖:
格式:@outer # get_money = outer(get_money)
代码案例:
装饰器格式:
注意:装饰器是一旦使用了@语法糖,便开始进行装饰,并非是在函数调用的时候才开始装饰
装饰器的定义:
1、装饰器需要有外层函数和内层函数
2、在装饰器的内层函数中调用要被装饰的函数
3、在外层函数中不要忘记返回内层函数的应用
4、外层函数就是那个装饰器
装饰器的应用场景:
引入日志、函数执行时间统计、执行函数前预备处理、执行函数后清理功能、权限校验等
场景、缓存、事务处理、数据清理、数据添加、附加功能等
代码实现:
计算代码执行时间:
装饰器报错日志案例:
·
装饰器的分类:
没有参数没有返回值:
装饰器报错日志案例、计算代码执行时间、便是此类型
有参数没有返回值:
多个函数共用一个装饰器:
不定长参数的函数装饰(万能):
有返回值的函数进行装饰:
注意点:
如果想要对函数装饰,不管有没有参数,有几个参数,有没有返回值,
①只需要用`*args`和`**kwargs`来完成不定长参数,
②在调用的时候,使用`*args`和`**kwargs`来拆包,
③同时接收原函数的返回值结果,同时`return`返回即可。那么此时这个装饰器即为万能装饰器
装饰器并不是在函数调用的时候才开始装饰,而是一个开始就已经进行了装饰
装饰器高级用法(多个装饰器装饰同一个函数):
多层装饰器开始执行时,先启用挨着函数的装饰器,之后再依次向上递推,执行的时候,
先执行侯勇的装饰器函数,依次执行,关闭的时候再递推回去,相当于栈的双向使用。
装饰器总结:
1.装饰器多用于日志文件
2.装饰器可以传参可以有返回值
3.传参使用*args和**kwargs可以传入不定长参数,且注意拆包,之后返回即可
原文:https://www.cnblogs.com/wenchao-123/p/14158029.html