一、闭包函数的概念
闭包 = 一个函数 + 外部封闭的作用域
闭包函数的特征:
- 函数中嵌套一个函数
- 外层函数rertun返回 内层函数
- 内层函数有引用 外部作用域 的非全局变量
def funcB1():x = 100def funcB2():c = x * 2print(c)return funcB2# 调用闭包函数 返回的结果就是一个闭包
# 闭包 = 一个函数 + 外部封闭作用域
# 封闭作用域的值在外面是没有办法进行修改的
res = funcB1()print(res)
res()# 运行结果
# <function funcB1.<locals>.funcB2 at 0x000001B8B48BC310>
# 200
因为作用域的原因,在函数外部就无法拿到函数中的变量和内部函数。通常我们需要使用函数中的变量时,才去将变量返回的办法。同理,在使用内部函数时,我们也可以将函数名作为返回值返回。 这是闭包最常用的方式。
二、如何判断是否是闭包函数
函数名__closure__ 在函数是闭包函数时,返回一个cell元素;不是闭包时,返回None。
输出cell:
def funcB1():x = 100def funcB2():c = x * 2print(c)print(funcB2.__closure__)return funcB2# 调用闭包函数 返回的结果就是一个闭包
# 闭包 = 一个函数 + 外部封闭作用域
# 封闭作用域的值在外面是没有办法进行修改的
res = funcB1()
res()# (<cell at 0x0000027678A1C640: function object at 0x0000027678A0C310>, <cell at 0x0000027678A1CB50: int object at 0x00000276782655D0>)
输出None:
name = 'python'
def func():def inner():print(name)print(inner.__closure__) # Nonereturn innerf = func()
f()# None
# python