Skip to content

【练习】计数器函数

项目简介

计数器函数

知识模块

  • Python 编程语言

知识点

  • 闭包与装饰器

受众

  • 初级测试开发工程师
  • 初级Python开发工程师

作业要求

编写一个Python程序,实现一个计数器函数,该函数能够记录特定函数的调用次数。你需要使用闭包和装饰器来实现这个功能。

解题思路

  1. 定义一个外部函数作为装饰器,它将创建一个闭包来保存计数器变量。

  2. 在闭包内部,定义一个计数器变量并初始化为0。

  3. 创建一个内部函数,用于实际执行被装饰的函数,并在其中将计数器递增。

  4. 返回内部函数作为闭包的结果。

  5. 将装饰器应用到需要计数的函数上。

完整代码

# 定义装饰器函数
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"))

代码讲解

  1. def count_calls(func):定义了装饰器函数 count_calls,它接受一个函数 func 作为参数

  2. def wrapper(*args, **kwargs):定义内部函数 wrapper,它接受任意数量的位置参数 *args 和关键字参数 **kwargs

  3. nonlocal count:在 wrapper 内部,使用 nonlocal 关键字来声明 count 变量,这使得闭包内部能够修改外部函数的变量。

  4. func.__name__:用于获取函数的名称。

  5. return func(*args, **kwargs):调用原始函数 func,并将其结果返回。