【练习】计数器函数
项目简介
计数器函数
知识模块
- Python 编程语言
知识点
- 闭包与装饰器
受众
- 初级测试开发工程师
- 初级Python开发工程师
作业要求
编写一个Python程序,实现一个计数器函数,该函数能够记录特定函数的调用次数。你需要使用闭包和装饰器来实现这个功能。
解题思路
-
定义一个外部函数作为装饰器,它将创建一个闭包来保存计数器变量。
-
在闭包内部,定义一个计数器变量并初始化为0。
-
创建一个内部函数,用于实际执行被装饰的函数,并在其中将计数器递增。
-
返回内部函数作为闭包的结果。
-
将装饰器应用到需要计数的函数上。
完整代码
# 定义装饰器函数
def count_calls(func):
count = 0 # 初始化计数器变量
def wrapper(*args, **kwargs):
nonlocal count
count += 1
print(f"函数 '{func.__name__}' 已被调用 {count} 次。")
return func(*args, **kwargs) # 调用原始函数
return wrapper
# 使用装饰器来计数函数调用
@count_calls
def greet(name):
return f"Hello, {name}!"
# 调用被装饰的函数
print(greet("Alice"))
print(greet("Bob"))
print(greet("Charlie"))
代码讲解
-
def count_calls(func)
:定义了装饰器函数count_calls
,它接受一个函数func
作为参数 -
def wrapper(*args, **kwargs)
:定义内部函数wrapper
,它接受任意数量的位置参数*args
和关键字参数**kwargs
-
nonlocal count
:在wrapper
内部,使用nonlocal
关键字来声明count
变量,这使得闭包内部能够修改外部函数的变量。 -
func.__name__
:用于获取函数的名称。 -
return func(*args, **kwargs)
:调用原始函数func
,并将其结果返回。