321-闭包(装饰器的原理)

复习强化知识点

强化一下作用域 125-变量作用域
在全局定义的变量 => 全局变量
在局部定义的变量 => 局部变量

这里学一下global和nonlocal两个关键字 312-关键字global和nonlocal

装饰器是语法糖格式
装饰器由闭包组成
所以先学闭包

要学啥?

闭包的概念
闭包介绍
闭包的使用
修改闭包内使用的外部变量
装饰器的概念
装饰器的使用
通用装饰器的使用
多个装饰器的使用
带有参数装饰器
类装饰器的使用

学习目标
能够知道闭包的构成条件
能够知道定义闭包的基本语法
能够知道修改闭包内使用的外部变量所需要的关键字
能够知道定义装饰器的基本语法及其作用
能够写出通用的装饰器
能够使用多个装饰器装饰一个函数
能够写出带有参数的装饰器
能够知道类装饰器的使用

闭包

什么是闭包

回顾:变量的作用域
作用域就是变量的作用范围,在哪里可以使用,在哪里不可以使用。
Python中变量随着函数的出现,作用域可以划分两种情况:①全局作用域②局部作用域

问题:函数执行完毕后能不能把局部变量保留在内存中
答:闭包可以实现

闭包的作用

闭包的定义:

官方定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数地址,我们把这个使用外部函数变量的内部函数称为闭包。

这里复习函数进阶一下 :120-python函数

问题:如何把官方的闭包掌握下来?
官方定义的人性化定义:闭包三步走

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