1.闭包的作用
a.闭包可以保存函数内的变量,不会随着函数调用完而销毁
2.闭包的定义
a.在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
3.闭包示例
# 函数嵌套
def outer_func(num1):
def inner_func(num2):
# 内部函数使用了外部函数的变量或外部函数的参数
num = num1 + num2
print(f'num1: {num1}, num2: {num2}, num: {num}')
# 外部函数返回了内部函数
return inner_func
f = outer_func(10)
f(1)
f(2)
'''
num1: 10, num2: 1, num: 11
num1: 10, num2: 2, num: 12
'''
4.闭包和类相似,内部函数使用的外部函数的变量类似于类的属性
5.nonlocal可以在闭包内修改外部变量
a.不使用nonlocal
def outer_func(num1):
def inner_func(num2):
num1 = num2 + 10
print(f'num1: {num1}')
return inner_func
f = outer_func(10)
f(1)
f(2)
'''
num1: 11
num1: 12
'''
b.使用nonlocal
def outer_func(num1):
def inner_func(num2):
nonlocal num1
num1 = num2 + 10
print(f'num1 in inner func: {num1}')
print(f'num1 in outer func before: {num1}')
inner_func(1)
print(f'num1 in outer func after: {num1}')
return inner_func
f = outer_func(10)
f(1)
f(2)
'''
num1 in outer func before: 10
num1 in inner func: 11
num1 in outer func after: 11
num1 in inner func: 11
num1 in inner func: 12
'''
c.nonlocal实现Counter
# 定义一个函数,用于生成一个计数器
def counter():
# 定义一个外层函数的局部变量,用于存储计数值,初始为0
count = 0
# 定义一个嵌套函数,用于返回并修改计数值
def next():
# 使用nonlocal关键字声明要修改的外层函数的局部变量
nonlocal count
# 将计数值加1
count += 1
# 返回计数值
return count
# 返回嵌套函数
return next
c = counter()
print(c())
print(c())
print(c())
'''
1
2
3
'''