321-闭包(装饰器的原理)
复习强化知识点
强化一下作用域 125-变量作用域
在全局定义的变量 => 全局变量
在局部定义的变量 => 局部变量
这里学一下global和nonlocal两个关键字 312-关键字global和nonlocal
装饰器是语法糖格式
装饰器由闭包组成
所以先学闭包
要学啥?
闭包的概念
闭包介绍
闭包的使用
修改闭包内使用的外部变量
装饰器的概念
装饰器的使用
通用装饰器的使用
多个装饰器的使用
带有参数装饰器
类装饰器的使用
学习目标
能够知道闭包的构成条件
能够知道定义闭包的基本语法
能够知道修改闭包内使用的外部变量所需要的关键字
能够知道定义装饰器的基本语法及其作用
能够写出通用的装饰器
能够使用多个装饰器装饰一个函数
能够写出带有参数的装饰器
能够知道类装饰器的使用
闭包
什么是闭包
回顾:变量的作用域
作用域就是变量的作用范围,在哪里可以使用,在哪里不可以使用。
Python中变量随着函数的出现,作用域可以划分两种情况:①全局作用域②局部作用域
问题:函数执行完毕后能不能把局部变量保留在内存中
答:闭包可以实现
闭包的作用
- 在函数执行完毕后保留局部变量在内存
- 保存函数内部的局部变量在内存,不会被垃圾回收
- 编写装饰器,装饰器本质就是一个闭包函数
闭包的定义:
官方定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数地址,我们把这个使用外部函数变量的内部函数称为闭包。
这里复习函数进阶一下 :120-python函数
问题:如何把官方的闭包掌握下来?
官方定义的人性化定义:闭包三步走
- ①有嵌套(函数嵌套)
- ②有引用
- ③有返回
(本质是让垃圾回收的某某计数器值不为0,这样就不会被清掉)
def outer():
# 局部变量
num2 = 100 # 被第五行调用,内存计数器+1,≠0不能被清掉
def inner(): # 被第六行调用,内存计数器+1,≠0不能被清掉
print(num2)
return inner # 不能inner(),这样就是执行,执行完计数器又是0了
# 全局变量引用了outer函数返回值
fn = outer() # 把outer函数执行结果赋值给全局变量fn
fn() # 找到inner函数在内存中的地址并立即执行print(num2),num2=100,所以弹出100
闭包要掌握的两个方面:①遇到闭包案例,知道如何解题,②能使用闭包编写Python装饰器
闭包的题目
闭包三步走:①有嵌套②有引用③有返回
闭包作用?当函数执行完毕后,让局部变量一直驻留在内存中
def func():
#局部变量
result = 0
#嵌套函数
def inner(num):
#访问离它最近的局部变量
nonlocal result
#针对resuLt与num参数相加
result += num
print(result)
return inner
fn = func()
fn(1) # 1
fn(2) # 3
fn(3) # 6