装饰器
py
# 用于记录函数平均用时的装饰器
def average_time_decorator(func):
times = []
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
t = end_time - start_time
times.append(t) # 记录用时
print(f"{func.__name__} 的用时: {t:.6f} 秒")
return result
def get_avg_time():
avg_time = sum(times)/len(times) if len(times) > 0 else 0.
return avg_time
def clear_cache():
nonlocal times
times = []
wrapper.get_avg_time = get_avg_time
wrapper.clear_cache = clear_cache
return wrapper
使用示例:
python
@average_time_decorator
def my_function():
time.sleep(1)
# 调用函数
my_function()
my_function()
# 获取平均用时
print(f"平均用时: {my_function.get_avg_time():.6f} 秒")
# 清空缓存
my_function.clear_cache()
这样,装饰器就能正确记录函数的用时,并提供获取平均用时和清空缓存的功能。
nolocal 关键字
nonlocal
关键字在 Python 中用于声明一个变量不是局部变量,而是来自包含它的直接外部函数的作用域。它只会影响直接上层函数的变量,而不会跨越多个层次。
示例
考虑以下多层嵌套的函数:
python
def outer_function():
x = 10
def middle_function():
x = 20
def inner_function():
nonlocal x
x = 30
print("Inner function x:", x)
inner_function()
print("Middle function x:", x)
middle_function()
print("Outer function x:", x)
outer_function()
输出将是:
Inner function x: 30
Middle function x: 30
Outer function x: 10
在这个例子中:
inner_function
中的nonlocal x
声明了x
是来自middle_function
的变量。inner_function
中的x = 30
语句修改了middle_function
中的x
,使其从 20 变为 30。outer_function
中的x
保持不变,仍然是 10。
总结
nonlocal
关键字只会影响直接上层函数的变量,而不会跨越多个层次。如果你需要修改更外层函数的变量,你需要在每一层都使用 nonlocal
声明。