当前位置: 首页 > article >正文

Python3 【装饰器】水平考试和答案

Python3 【装饰器】水平考试和答案

本试卷包含选择题 15 题、填空题 10 题和编程题 5 题,共计 30 道题,满分 100 分。每道题后附有正确答案和解析。


选择题(每题2分,共30分)

  1. 装饰器的本质是什么?
    A. 类
    B. 函数
    C. 模块
    D. 变量
    答案:B
    解析:装饰器本质上是函数,用于修改或扩展其他函数的行为。

  2. 以下哪个符号用于装饰器语法?
    A. #
    B. @
    C. $
    D. &
    答案:B
    解析@ 符号用于装饰器语法。

  3. 以下代码的输出是什么?

    def decorator(func):
        def wrapper():
            print("装饰器逻辑")
            func()
        return wrapper
    
    @decorator
    def my_function():
        print("函数逻辑")
    
    my_function()
    

    A. 装饰器逻辑
    B. 函数逻辑
    C. 装饰器逻辑 函数逻辑
    D. 无输出
    答案:C
    解析:装饰器会先执行 wrapper 中的逻辑,再调用原函数。

  4. 以下哪个函数可以保留被装饰函数的元信息?
    A. functools.wraps
    B. functools.partial
    C. functools.reduce
    D. functools.lru_cache
    答案:A
    解析functools.wraps 用于保留被装饰函数的元信息。

  5. 以下代码的输出是什么?

    def decorator(func):
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs) + 1
        return wrapper
    
    @decorator
    def add(a, b):
        return a + b
    
    print(add(2, 3))
    

    A. 5
    B. 6
    C. 7
    D. 8
    答案:B
    解析:装饰器对函数结果进行了加1操作。

  6. 以下哪个场景适合使用装饰器?
    A. 计算两个数的和
    B. 记录函数的执行时间
    C. 定义类属性
    D. 创建列表
    答案:B
    解析:装饰器常用于记录日志、性能测试等场景。

  7. 以下代码的输出是什么?

    def decorator(func):
        def wrapper():
            print("装饰器逻辑")
        return wrapper
    
    @decorator
    def my_function():
        print("函数逻辑")
    
    my_function()
    

    A. 装饰器逻辑
    B. 函数逻辑
    C. 装饰器逻辑 函数逻辑
    D. 无输出
    答案:A
    解析:装饰器中未调用原函数,因此只执行了 wrapper 的逻辑。

  8. 以下哪个装饰器可以缓存函数的结果?
    A. @functools.lru_cache
    B. @functools.wraps
    C. @staticmethod
    D. @property
    答案:A
    解析@functools.lru_cache 用于缓存函数的结果。

  9. 以下代码的输出是什么?

    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
    解析:装饰器将函数返回值转换为大写。

  10. 以下哪个装饰器用于限制函数调用频率?
    A. @rate_limit
    B. @cache
    C. @retry
    D. @log
    答案:A
    解析@rate_limit 用于限制函数调用频率。

  11. 以下代码的输出是什么?

    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"。

  12. 以下哪个装饰器用于将方法定义为类方法?
    A. @staticmethod
    B. @classmethod
    C. @property
    D. @abstractmethod
    答案:B
    解析@classmethod 用于定义类方法。

  13. 以下代码的输出是什么?

    def decorator(func):
        def wrapper():
            return func() * 2
        return wrapper
    
    @decorator
    def get_value():
        return 5
    
    print(get_value())
    

    A. 5
    B. 10
    C. 25
    D. 无输出
    答案:B
    解析:装饰器将函数返回值乘以2。

  14. 以下哪个装饰器用于将方法定义为静态方法?
    A. @staticmethod
    B. @classmethod
    C. @property
    D. @abstractmethod
    答案:A
    解析@staticmethod 用于定义静态方法。

  15. 以下代码的输出是什么?

    def decorator(func):
        def wrapper():
            return func() + 10
        return wrapper
    
    @decorator
    def get_value():
        return 5
    
    print(get_value())
    

    A. 5
    B. 10
    C. 15
    D. 无输出
    答案:C
    解析:装饰器在函数返回值后加了10。


填空题(每题3分,共30分)

  1. 装饰器的本质是一个______。
    答案:函数

  2. 使用 @ 符号调用装饰器时,装饰器函数必须返回一个______。
    答案:函数

  3. functools.wraps 的作用是保留被装饰函数的______。
    答案:元信息

  4. 以下代码的输出是______。

    def decorator(func):
        def wrapper():
            return func() + 1
        return wrapper
    
    @decorator
    def get_value():
        return 5
    
    print(get_value())
    

    答案:6

  5. 以下代码的输出是______。

    def decorator(func):
        def wrapper():
            return func().upper()
        return wrapper
    
    @decorator
    def greet():
        return "hello"
    
    print(greet())
    

    答案:HELLO

  6. 以下代码的输出是______。

    def decorator(func):
        def wrapper():
            return func() * 2
        return wrapper
    
    @decorator
    def get_value():
        return 3
    
    print(get_value())
    

    答案:6

  7. 以下代码的输出是______。

    def decorator(func):
        def wrapper():
            return func() + " world"
        return wrapper
    
    @decorator
    def greet():
        return "hello"
    
    print(greet())
    

    答案:hello world

  8. 以下代码的输出是______。

    def decorator(func):
        def wrapper():
            return func() + 10
        return wrapper
    
    @decorator
    def get_value():
        return 5
    
    print(get_value())
    

    答案:15

  9. 以下代码的输出是______。

    def decorator(func):
        def wrapper():
            return func() + 1
        return wrapper
    
    @decorator
    def get_value():
        return 5
    
    print(get_value())
    

    答案:6

  10. 以下代码的输出是______。

    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分)

  1. 编写一个装饰器,记录函数的执行时间并打印。
    答案:

    import time
    
    def 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 result
        return wrapper
    
    @timer_decorator
    def my_function():
        time.sleep(2)
    
    my_function()
    
  2. 编写一个装饰器,缓存函数的结果以避免重复计算。
    答案:

    def cache_decorator(func):
        cache = {}
        def wrapper(*args):
            if args in cache:
                return cache[args]
            result = func(*args)
            cache[args] = result
            return result
        return wrapper
    
    @cache_decorator
    def fibonacci(n):
        if n < 2:
            return n
        return fibonacci(n-1) + fibonacci(n-2)
    
    print(fibonacci(10))
    
  3. 编写一个装饰器,限制函数的调用频率(例如每秒最多调用一次)。
    答案:

    import time
    
    def 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 wrapper
        return decorator
    
    @rate_limit_decorator(max_calls=1, period=1)
    def my_function():
        print("函数调用")
    
    my_function()
    
  4. 编写一个装饰器,实现函数的重试机制(例如失败后重试3次)。
    答案:

    import random
    
    def 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 wrapper
        return decorator
    
    @retry_decorator(max_retries=3)
    def unstable_function():
        if random.random() < 0.5:
            raise Exception("随机失败")
        return "成功"
    
    print(unstable_function())
    
  5. 编写一个装饰器,将函数的返回值格式化为 JSON 字符串。
    答案:

    import json
    
    def 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 装饰器的知识!


http://www.kler.cn/a/526993.html

相关文章:

  • 机器学习2 (笔记)(朴素贝叶斯,集成学习,KNN和matlab运用)
  • 【自学嵌入式(7)天气时钟:WiFi模块、OLED模块、NTP模块开发】
  • 留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB
  • Python中的函数(下)
  • 【Redis】 String 类型的介绍和常用命令
  • ping命令详解Type 8和0 或者Type 3
  • 复杂场景使用xpath定位元素
  • 计算机网络 笔记 网络层 3
  • C++ deque(1)
  • 元旦和春节取名的历史变迁
  • ESP32-S3模组上跑通esp32-camera(38)
  • 嵌入式系统|DMA和SPI
  • GitHub上传文件异常 显示this file is hidden
  • 《苍穹外卖》项目学习记录-Day7缓存套餐
  • 1 HDFS
  • 深入解析 COUNT(DISTINCT) OVER(ORDER BY):原理、问题与高效替代方案
  • Visual Studio使用GitHub Copilot提高.NET开发工作效率
  • Day50:字典的合并
  • nodejs:express + js-mdict 网页查询英汉词典
  • 算法基础——存储
  • 智能小区物业管理系统推动数字化转型与提升用户居住体验
  • 实测数据处理(Wk算法处理)——SAR成像算法系列(十二)
  • 如何让一个用户具备创建审批流程的权限
  • OpticStudio 中的全息图建模 – 反射形式
  • 在Windows中 基于Oracle GoldenGate (OGG)进行MySQL-gt;MySQL数据库同步配置(超详细)_ogg-15146
  • 【MyDB】4-VersionManager 之 4-VM的实现