闭包要满足以下三个条件:
1. 内层函数的定义嵌套在外层函数中。
2. 内层函数引用外层函数的变量
3. 外层函数返回内层函数名
闭包的作用:
1、保护变量:闭包可以有效地保护外层函数的变量,使其在外部无法直接访问和修改,但内层函数可以继续访问和使用这些变量。
def outer_function():
x = 10
def inner_function():
print(x) # 内层函数保留了对外层函数 x 变量的引用
return inner_function
closure = outer_function()
closure() # 输出:10
2、数据封装:闭包可以封装一组变量和函数,形成一个独立的功能单元,避免全局作用域的污染。
def greeting(name):
def say_hello():
print("Hello, " + name)
def say_goodbye():
print("Goodbye, " + name)
return say_hello, say_goodbye
hello, goodbye = greeting("Alice")
hello() # 输出:Hello, Alice
goodbye() # 输出:Goodbye, Alice
3、延迟计算:闭包延迟计算是指将某些操作推迟到闭包被调用的时刻,可以灵活地控制执行时机。
def power_of(n):
def inner(x):
return x ** n
return inner
square = power_of(2)
cube = power_of(3)
print(square(5)) # 输出:25
print(cube(5)) # 输出:125
4、实现装饰器:装饰器是使用闭包实现的一种常见模式,它可以在不改变原函数代码的情况下,为函数添加额外的功能。
def logger(func):
def inner(*args, **kwargs):
print("Function {} was called".format(func.__name__))
return func(*args, **kwargs)
return inner
@logger
def add(a, b):
return a + b
result = add(2, 3) # 输出:Function add was called
print(result) # 输出:5