闭包
闭包:函数里面的函数称为闭包
里面的函数用到了外面函数的变量,将里面的函数返回并赋值给一个变量,就可以调用里面的函数
当闭包赋值给了两个变量,这两个变量对应内存中不同的位置
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8badf2b9a9affbfc6fd417c90dd8f7ef.png)
装饰器
有这样一个环境:当写完一个函数f1,当需要调用这个函数时,我们需要做一些额外的事情,比如判断是否有调去这个函数的权限
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c79cd01c26d13e64d15c239ab4402d60.png)
图中所指两行代码作用相同
装饰的时间
只要执行到装饰这行代码(@w1)就会进行装饰,而不是等到调用的时候装饰
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/eda2a02639434d64c65f2d9aab62bb38.png)
多个装饰器
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0b025ff597486c54ad66bb7e001a55b0.png)
对不定长参数的函数进行装饰
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1ba4fd895a11d82bef4b3c896814a1e7.png)
有返回值装饰
先将返回值保存到装饰器,再返回
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5a3a184ed5e5fdab6868743f6b96bb64.png)
通用装饰器
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a53560316a0cf5409ddd52ed55a90e99.png)
带有参数的装饰器
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4a931cc49ca23f1290d32f7762752f5b.png)