闭包是指在函数中定义的函数,并且这个内部函数可以访问到外部函数中的变量。具体来说,在一个函数中定义了另一个函数,并且内部函数使用了外部函数的变量,那么这个内部函数就是一个闭包。
闭包的特点是可以“记住”它被定义时的环境,即使该环境已经不存在了,并且在后续调用时可以使用这些记住的变量。
下面是6个示例说明闭包的实际应用:
1. 缓存:
def cache():
data = {}
def get(key):
return data.get(key, None)
def set(key, value):
data[key] = value
return get, set
get_func, set_func = cache()
set_func('name', 'Alice')
print(get_func('name')) # 输出: Alice
2. 计数器:
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
counter_func = counter() print(counter_func()) # 输出: 1
print(counter_func()) # 输出: 2
3. 延迟执行:
def lazy_sum(a, b):
def sum():
return a + b
return sum
sum_func = lazy_sum(1, 2)
print(sum_func()) # 输出: 3
4. 装饰器:
def logger(func):
def wrapper(*args, **kwargs):
print('Calling function:', func.__name__)
return func(*args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
print(add(1, 2)) # 输出: Calling function: add; 3
5. 封装私有变量:
def private_var(initial_value):
var = initial_value
def get_var():
return var
def set_var(new_value):
nonlocal var
var = new_value
return get_var, set_var
get_func, set_func = private_var(5)
print(get_func()) # 输出: 5
set_func(10)
print(get_func()) # 输出: 10
6. 制作计时器:
import time
def timer():
start_time = time.time()
def get_elapsed_time():
return time.time() - start_time
return get_elapsed_time
timer_func = timer()
time.sleep(2)
print(timer_func()) # 输出: 大约2.0
这些示例展示了闭包在缓存、计数器、延迟执行、装饰器、封装私有变量和制作计时器等场景中的应用。通过使用闭包,可以方便地实现一些功能,并且良好地封装变量,提高代码的可读性和可维护性。