Python3 【装饰器】水平考试和答案
本试卷包含选择题 15 题、填空题 10 题和编程题 5 题,共计 30 道题,满分 100 分。每道题后附有正确答案和解析。
选择题(每题2分,共30分)
-
装饰器的本质是什么?
A. 类
B. 函数
C. 模块
D. 变量
答案:B
解析:装饰器本质上是函数,用于修改或扩展其他函数的行为。 -
以下哪个符号用于装饰器语法?
A.#
B.@
C.$
D.&
答案:B
解析:@
符号用于装饰器语法。 -
以下代码的输出是什么?
python">def decorator(func):def wrapper():print("装饰器逻辑")func()return wrapper@decorator def my_function():print("函数逻辑")my_function()
A. 装饰器逻辑
B. 函数逻辑
C. 装饰器逻辑 函数逻辑
D. 无输出
答案:C
解析:装饰器会先执行wrapper
中的逻辑,再调用原函数。 -
以下哪个函数可以保留被装饰函数的元信息?
A.functools.wraps
B.functools.partial
C.functools.reduce
D.functools.lru_cache
答案:A
解析:functools.wraps
用于保留被装饰函数的元信息。 -
以下代码的输出是什么?
python">def decorator(func):def wrapper(*args, **kwargs):return func(*args, **kwargs) + 1return wrapper@decorator def add(a, b):return a + bprint(add(2, 3))
A. 5
B. 6
C. 7
D. 8
答案:B
解析:装饰器对函数结果进行了加1操作。 -
以下哪个场景适合使用装饰器?
A. 计算两个数的和
B. 记录函数的执行时间
C. 定义类属性
D. 创建列表
答案:B
解析:装饰器常用于记录日志、性能测试等场景。 -
以下代码的输出是什么?
python">def decorator(func):def wrapper():print("装饰器逻辑")return wrapper@decorator def my_function():print("函数逻辑")my_function()
A. 装饰器逻辑
B. 函数逻辑
C. 装饰器逻辑 函数逻辑
D. 无输出
答案:A
解析:装饰器中未调用原函数,因此只执行了wrapper
的逻辑。 -
以下哪个装饰器可以缓存函数的结果?
A.@functools.lru_cache
B.@functools.wraps
C.@staticmethod
D.@property
答案:A
解析:@functools.lru_cache
用于缓存函数的结果。 -
以下代码的输出是什么?
python">def decorator(func):def wrapper():return func().upper()return wrapper@decorator def greet():return "hello"print(greet())
A. hello
B. HELLO
C. Hello
D. 无输出
答案:B
解析:装饰器将函数返回值转换为大写。 -
以下哪个装饰器用于限制函数调用频率?
A.@rate_limit
B.@cache
C.@retry
D.@log
答案:A
解析:@rate_limit
用于限制函数调用频率。 -
以下代码的输出是什么?
python">def decorator(func):def wrapper():return func() + " world"return wrapper@decorator def greet():return "hello"print(greet())
A. hello
B. world
C. hello world
D. 无输出
答案:C
解析:装饰器在函数返回值后添加了 " world"。 -
以下哪个装饰器用于将方法定义为类方法?
A.@staticmethod
B.@classmethod
C.@property
D.@abstractmethod
答案:B
解析:@classmethod
用于定义类方法。 -
以下代码的输出是什么?
python">def decorator(func):def wrapper():return func() * 2return wrapper@decorator def get_value():return 5print(get_value())
A. 5
B. 10
C. 25
D. 无输出
答案:B
解析:装饰器将函数返回值乘以2。 -
以下哪个装饰器用于将方法定义为静态方法?
A.@staticmethod
B.@classmethod
C.@property
D.@abstractmethod
答案:A
解析:@staticmethod
用于定义静态方法。 -
以下代码的输出是什么?
python">def decorator(func):def wrapper():return func() + 10return wrapper@decorator def get_value():return 5print(get_value())
A. 5
B. 10
C. 15
D. 无输出
答案:C
解析:装饰器在函数返回值后加了10。
填空题(每题3分,共30分)
-
装饰器的本质是一个______。
答案:函数 -
使用
@
符号调用装饰器时,装饰器函数必须返回一个______。
答案:函数 -
functools.wraps
的作用是保留被装饰函数的______。
答案:元信息 -
以下代码的输出是______。
python">def decorator(func):def wrapper():return func() + 1return wrapper@decorator def get_value():return 5print(get_value())
答案:6
-
以下代码的输出是______。
python">def decorator(func):def wrapper():return func().upper()return wrapper@decorator def greet():return "hello"print(greet())
答案:HELLO
-
以下代码的输出是______。
python">def decorator(func):def wrapper():return func() * 2return wrapper@decorator def get_value():return 3print(get_value())
答案:6
-
以下代码的输出是______。
python">def decorator(func):def wrapper():return func() + " world"return wrapper@decorator def greet():return "hello"print(greet())
答案:hello world
-
以下代码的输出是______。
python">def decorator(func):def wrapper():return func() + 10return wrapper@decorator def get_value():return 5print(get_value())
答案:15
-
以下代码的输出是______。
python">def decorator(func):def wrapper():return func() + 1return wrapper@decorator def get_value():return 5print(get_value())
答案:6
-
以下代码的输出是______。
python">def decorator(func): def wrapper(*args):return func(*args).upper() return wrapper@decorator def greet(username):return "hello" + ' ' + username + '!'print(greet("roger"))
答案:HELLO ROGER!
编程题(每题8分,共40分)
-
编写一个装饰器,记录函数的执行时间并打印。
答案:python">import timedef timer_decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"{func.__name__} 执行时间: {end_time - start_time:.4f}秒")return resultreturn wrapper@timer_decorator def my_function():time.sleep(2)my_function()
-
编写一个装饰器,缓存函数的结果以避免重复计算。
答案:python">def cache_decorator(func):cache = {}def wrapper(*args):if args in cache:return cache[args]result = func(*args)cache[args] = resultreturn resultreturn wrapper@cache_decorator def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10))
-
编写一个装饰器,限制函数的调用频率(例如每秒最多调用一次)。
答案:python">import timedef rate_limit_decorator(max_calls, period):calls = []def decorator(func):def wrapper(*args, **kwargs):now = time.time()calls.append(now)calls[:] = [call for call in calls if now - call < period]if len(calls) > max_calls:raise Exception("调用频率过高")return func(*args, **kwargs)return wrapperreturn decorator@rate_limit_decorator(max_calls=1, period=1) def my_function():print("函数调用")my_function()
-
编写一个装饰器,实现函数的重试机制(例如失败后重试3次)。
答案:python">import randomdef retry_decorator(max_retries=3):def decorator(func):def wrapper(*args, **kwargs):for i in range(max_retries):try:return func(*args, **kwargs)except Exception as e:print(f"重试 {i+1}/{max_retries}: {e}")raise Exception("重试次数用尽")return wrapperreturn decorator@retry_decorator(max_retries=3) def unstable_function():if random.random() < 0.5:raise Exception("随机失败")return "成功"print(unstable_function())
-
编写一个装饰器,将函数的返回值格式化为 JSON 字符串。
答案:python">import jsondef json_decorator(func):def wrapper(*args, **kwargs):result = func(*args, **kwargs)return json.dumps(result)return wrapper@json_decorator def my_function():return {"name": "Alice", "age": 30}print(my_function())
总分:100分
希望这套试卷能帮助你巩固 Python 装饰器的知识!