闭包的实际应用(Python)
- 计数器
一个常见的闭包应用是创建一个计数器函数,每次调用时返回递增的计数值。
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter = make_counter()
print(counter()) # 输出: 1
print(counter()) # 输出: 2
print(counter()) # 输出: 3
- 记忆化(Memoization)
闭包可以用于创建一个记忆化函数,以缓存之前的计算结果,提高函数的执行效率。
def memoize(f):
cache = {}
def memoized_function(x):
if x not in cache:
cache[x] = f(x)
return cache[x]
return memoized_function
@memoize
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(10)) # 输出: 55
- 配置函数
闭包可以用于创建带有特定配置的函数。以下示例展示了如何创建一个带有自定义前缀的日志记录函数。
def make_logger(prefix):
def logger(message):
print(f"{prefix}: {message}")
return logger
error_logger = make_logger("ERROR")
info_logger = make_logger("INFO")
error_logger("This is an error message.") # 输出: ERROR: This is an error message.
info_logger("This is an info message.") # 输出: INFO: This is an info message.
- 事件处理器
在 GUI 编程中,闭包可以用于创建特定事件处理器,例如点击按钮时执行特定操作。
def make_button_click_handler(button_name):
def on_click():
print(f"Button {button_name} clicked!")
return on_click
button1_click = make_button_click_handler("Submit")
button2_click = make_button_click_handler("Cancel")
button1_click() # 输出: Button Submit clicked!
button2_click() # 输出: Button Cancel clicked!
- 访问控制
闭包可以用于隐藏内部数据,实现某种程度的访问控制。
def make_account(balance):
def deposit(amount):
nonlocal balance
balance += amount
return balance
def withdraw(amount):
nonlocal balance
if amount > balance:
return "Insufficient funds"
balance -= amount
return balance
return deposit, withdraw
deposit, withdraw = make_account(100)
print(deposit(50)) # 输出: 150
print(withdraw(30)) # 输出: 120
print(withdraw(200)) # 输出: Insufficient funds