闭包的形成条件:1:函数嵌套2:嵌套函数使用外部函数变量3:外部函数返回内部函数引用在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
# 做一个线性函数的例子y = 3x+20
# 1.0 函数内部嵌套了函数
def workClosure(a,b):

# 初始化a,b的值
a = a
b = b

def liner(number):
# 2.0 使用的函数变量
return a * number + b
# 3.0 返回内部函数引用
return liner
# 实例化一个闭包,下面相当于返回一个函数实例 y = 4x+5
# example = workClosure(4,5) ===>>> 由于workClosure返回的是liner===>>> 推出example 指向 liner
# 此时的example就指向了liner的引用
example = workClosure(4,5)


# 设置x的值,描述函数的y值,
for i in range(0,100):
print('函数值:', example(i))
闭包还可以提高代码的可重用性,不需要再手动定义额外的功能函数最简单的是用户的对话
def say_hello(name,info):
print(name,":",info)
# 要实现
say_hello("tom","正在工作")
# 每一次都要这么调用那还不如放弃

# 用闭包
def config_name(name):
# 嵌套内部函数
def say_hello(info):

print(name,":",info)
return say_hello

# 这样一次性绑定了一个用户名字;一次传,一直用,简洁了代码
tom = config_name("Tom")
print(tom("睡觉了"))
print(tom("起床了"))

外嵌套函数变量

# 错误示范
# 定义一个外部函数
def func_out():
num1 = 20
# 定义一个内部函数
def func_inner(num2):
# 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1
num1 = 10
# 内部函数使用了外部函数的变量(num1)
result = num1 + num2
print("结果是:", result)

print(num1)
func_inner(1)
print(num1)

# 外部函数返回了内部函数,这里返回的内部函数就是闭包
return func_inner

# 创建闭包实例
f = func_out()
# 执行闭包

想要修改外嵌套函数变量,可以使用nonlocal关键字

# 定义一个外部函数
def func_out(num1):

# 定义一个内部函数
def func_inner(num2):
# 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1
nonlocal num1 # 告诉解释器,此处使用的是 外部变量a
# 修改外部变量num1
num1 = 10
# 内部函数使用了外部函数的变量(num1)
result = num1 + num2
print("结果是:", result)

print(num1)
func_inner(1)
print(num1)

# 外部函数返回了内部函数,这里返回的内部函数就是闭包
return func_inner

# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)