简单介绍:闭包是指在一个函数内部定义的函数,并且这个内部函数引用了外部函数中的变量。闭包允许这个内部函数捕获和访问外部函数的局部变量,即使外部函数已经执行完毕。
def outer_func(x):
def inner_func(y):
return x + y
return inner_func
closure = outer_func(10)
result = closure(5)
print(result)
这个例子中外部函数接受一个参数x,然后定义一个内部函数,这个内部函数引用了外部函数中的x。最后outer_func返回了inner_func。当我们调用outer_func(10)时候,返回了一个闭包closure,这个闭包可以在后续的调用中使用。所以当调用closure(5)时,实际上已经使用了外部函数中的x,所以输出15。
主要作用:
封装:闭包允许将函数与其相关的状态(局部变量)捆绑在一起,形成一个封闭的单元。这种封装有助于隐藏实现的细节,提高代码的模块化与可实现性。
保持状态:闭包可以用于保持函数执行时的状态。内部函数可以访问并修改外部函数的局部变量,因此可以在多次调用之间保留状态。这对于某些记录状态的任务(计数器、累加器等)很有用。
实现装饰器:装饰器是一种使用闭包的常见模式。通过使用闭包可以轻松创建装饰器,在不修改原始代码的情况下添加额外的功能。
函数工厂:闭包允许创建函数工厂,即生成和返回其他函数的函数。这对于根据不同的配置生成不同行为的函数非常有用。
回调函数:闭包可以作为回调函数,传递给其他函数,以在稍后的时间点执行。
示例二:
def outer_func(x):
value = x
def inner_func(y):
nonlocal value
value += y
return value
return inner_func
counter = outer_func(0)
print(counter(1)) #1
print(counter(3)) #4
print(counter(5)) #9
通过调用outer_fun(00?创建了一个闭包counter,它保持着一个状态(value的值),并且可以在多次调用中保持这个状态。每次调用counter(1)、counter(3)、counter(5) 都会在原有的基础上递增,并返回累积的结果。