🌙
交互式练习

LLM 练习 003

34 道题 · 选择题 + 填空题 + 简答题 + 代码实战 · 即时反馈 · 记录保存
← 返回主页
客观题
0/20
主观题
0/14
做题记录

做题记录

    暂无记录

    答题详情

    一、单选题(10 题)
    第 1 题单选题
    闭包的三大构成条件是( )。
    A 有循环、有判断、有返回
    B 有嵌套、有引用、有返回
    C 有参数、有注释、有调用
    D 有类、有对象、有继承
    第 2 题单选题
    下列属于闭包语法核心的是( )。
    A 外部函数返回内部函数名
    B 内部函数必须无参
    C 外部函数必须是全局函数
    D 内部函数必须使用 global
    第 3 题单选题
    闭包最典型的作用是( )。
    A 提高网络速度
    B 保存外层变量并延长其生命周期
    C 自动生成类
    D 替代 if 判断
    第 4 题单选题
    在内部函数中修改外层(非全局)变量应使用( )。
    A global
    B nonlocal
    C static
    D lambda
    第 5 题单选题
    装饰器的本质是( )。
    A 继承
    B 闭包函数
    C 递归函数
    D 抽象类
    第 6 题单选题
    装饰器的核心价值是( )。
    A 修改原函数源码实现增强
    B 不改原函数源码给函数增加额外功能
    C 让函数无法调用
    D 只能装饰无参函数
    第 7 题单选题
    下列与 @check 等价的写法是( )。
    A check = check(func)
    B func = @check(func)
    C func = check(func)
    D @func = check
    第 8 题单选题
    多个装饰器装饰同一个函数时,正确描述是( )。
    A 离函数最远的先装饰
    B 离函数最近的先装饰
    C 先写的先执行原函数
    D 顺序固定与书写无关
    第 9 题单选题
    通用装饰器适配各种函数签名,推荐内部函数参数写为( )。
    A a, b
    B x
    C *args, **kwargs
    D 无参数
    第 10 题单选题
    带参数装饰器 @logging("+") 通常需要( )。
    A 一层函数
    B 两层函数
    C 三层函数
    D 不需要函数
    二、填空题(10 题)
    第 11 题填空题
    闭包定义中,外层函数返回的是内部函数的(),而不是执行结果。
    第 12 题填空题
    闭包三条件是有嵌套、有引用、有()。
    第 13 题填空题
    在内部函数中修改外层变量时,需先用关键字()声明。
    第 14 题填空题
    装饰器是"接收函数并返回新函数"的一种()。
    第 15 题填空题
    装饰器语法糖 @deco 等价于 函数名 = (
    第 16 题填空题
    当原函数有返回值时,装饰器内部函数也应()原函数结果。
    第 17 题填空题
    多个装饰器修饰同一函数时,装饰过程是由()到()。
    第 18 题填空题
    通用装饰器常见模板中,参数接收写成()与()。
    第 19 题填空题
    带参数装饰器语法糖通常是"外层收参数,中层收函数,内层做包装"的()层结构。
    第 20 题填空题
    装饰器常见业务场景包括日志、权限、()统计。
    三、简答题(6 题)
    第 21 题简答题
    用自己的话解释"为什么闭包能让外层变量在函数结束后仍可用"。
    查看参考答案 ▼
    内部函数持续引用外层变量,导致变量随闭包一起被保留,不会被垃圾回收,生命周期被延长。
    第 22 题简答题
    globalnonlocal 有什么本质区别?分别作用于哪一层变量?
    查看参考答案 ▼
    global 操作全局变量(模块级别),nonlocal 操作外层函数(非全局)变量。两者作用域层级不同。
    第 23 题简答题
    为什么说"所有装饰器都是闭包,但不是所有闭包都是装饰器"?
    查看参考答案 ▼
    装饰器满足闭包结构(嵌套+引用+返回)且必须"接收函数并增强返回"。普通闭包不一定接收函数,也不一定增强行为。
    第 24 题简答题
    装饰器在企业开发中有哪些典型应用场景?至少举 3 个。
    查看参考答案 ▼
    常见场景:登录校验、权限控制、日志记录、耗时统计、异常兜底。装饰器是 AOP(面向切面编程)在 Python 中的重要实现。
    第 25 题简答题
    多个装饰器叠加时,书写顺序和执行顺序如何理解?
    查看参考答案 ▼
    书写从上到下,装饰从内到外;离函数最近的先装饰,执行链也先进入内层包装。例如 @deco1 @deco2,deco2 先装饰。
    第 26 题简答题
    为什么通用装饰器必须关注"参数对齐 + 返回值对齐"?
    查看参考答案 ▼
    不对齐会导致参数丢失或返回值被吞,原函数行为被破坏。通用装饰器必须用 *args, **kwargs 保证参数通透,用 return 保证返回值不丢失。
    四、代码实战(8 题)
    第 27 题代码实战
    闭包基础(必做)
    定义外部函数 func_out(num1),内部函数 func_inner(num2)
    内部函数使用外部变量完成求和并打印。
    外部函数返回内部函数,创建闭包并调用。
    解释每一行如何对应"有嵌套/有引用/有返回"三条件。
    查看参考答案 ▼
    def func_out(num1): def func_inner(num2): # 内部函数引用了外层变量 num1 ——"有引用"</span> print("结果:", num1 + num2) # 外部函数返回内部函数名 ——"有返回"</span> return func_inner # 创建闭包:num1=10 被内部函数"记住"</span> f = func_out(10) # 调用闭包,num2=5 f(5) # 输出:结果: 15
    第 28 题代码实战
    nonlocal 闭包计数器(必做)
    编写 counter(),外层定义 count = 0
    内层函数每调用一次 count + 1 并返回新值。
    必须使用 nonlocal,并连续调用至少 3 次验证状态被保存。
    查看参考答案 ▼
    def counter(): count = 0 def add_one(): # nonlocal 声明要修改外层变量 nonlocal count count += 1 return count return add_one c = counter() print(c(), c(), c()) # 输出: 1 2 3
    第 29 题代码实战
    装饰器原始写法与语法糖(必做)
    定义登录校验装饰器 check
    用原始方式 comment = check(comment) 装饰一次。
    再用 @check 语法糖装饰另一个函数。
    对比两种写法并在注释中写出"等价关系"。
    查看参考答案 ▼
    def check(fn): def inner(): print("请先登录") fn() return inner def comment(): print("发表评论") # 原始方式:手动调用装饰器 comment = check(comment) comment() # 语法糖方式:@check 等价于 like = check(like)</span> @check def like(): print("点赞") like()
    第 30 题代码实战
    通用装饰器(重点必做)
    编写一个通用装饰器,内部函数使用 *args, **kwargs
    要求可装饰四类函数:1) 无参无返回 2) 有参无返回 3) 无参有返回 4) 有参有返回(含关键字参数)。
    演示调用结果,证明"参数和返回值都不丢失"。
    查看参考答案 ▼
    def universal_decorator(func): def inner(*args, **kwargs): print(">>> 增强逻辑开始") # 透传所有参数并接收返回值 result = func(*args, **kwargs) print(">>> 增强逻辑结束") # 必须 return 保证返回值不丢失 return result return inner # 测试四类函数 @universal_decorator def test1(): print("无参无返回") @universal_decorator def test2(name): print(f"有参: {name}") @universal_decorator def test3(): return "有返回" @universal_decorator def test4(a, b, c=0): return a + b + c test1() test2("张三") print(test3()) # 输出: 有返回 print(test4(1, 2, c=3)) # 输出: 6
    第 31 题代码实战
    多装饰器执行顺序(重点必做)
    定义两个装饰器 deco1deco2,分别打印"前/后"日志。
    同时装饰一个函数,观察执行顺序。
    用注释写清楚:谁先装饰、谁先执行。
    查看参考答案 ▼
    def deco1(fn): def inner(): print("deco1 前") fn() print("deco1 后") return inner def deco2(fn): def inner(): print("deco2 前") fn() print("deco2 后") return inner # deco2 离函数最近,先装饰(先包裹) # 执行顺序:deco1前 → deco2前 → 原函数 → deco2后 → deco1后 @deco1 @deco2 def work(): print("原函数执行") work() # 输出: # deco1 前 # deco2 前 # 原函数执行 # deco2 后 # deco1 后
    第 32 题代码实战
    带参数装饰器(重点必做)
    编写 logging(flag):当 flag 为 '+' 提示加法日志,'-' 提示减法日志。
    @logging('+') 装饰 add(a,b)
    @logging('-') 装饰 sub(a,b)
    输出运算结果并验证装饰器参数生效。
    查看参考答案 ▼
    def logging(flag): """最外层接收装饰器参数""" def decorator(fn): """中间层接收被装饰函数""" def inner(a, b): """最内层做实际包装""" if flag == "+": print("正在进行加法计算") elif flag == "-": print("正在进行减法计算") # 调用原函数并返回结果 return fn(a, b) return inner return decorator @logging("+") def add(a, b): return a + b @logging("-") def sub(a, b): return a - b print(add(1, 3)) # 输出: 正在进行加法计算 / 4 print(sub(5, 2)) # 输出: 正在进行减法计算 / 3
    第 33 题代码实战
    挑战题:函数耗时统计装饰器
    实现一个"函数耗时统计装饰器",输出函数名和执行时长。
    提示:使用 time.time() 记录开始和结束时间,计算差值。
    查看参考答案 ▼
    import time def timer(func): def inner(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"函数 {func.__name__} 执行耗时: {end - start:.4f} 秒") return result return inner @timer def slow_func(): total = 0 for i in range(1000000): total += i return total print(slow_func())
    第 34 题代码实战
    挑战题:权限装饰器
    实现一个"权限装饰器":未登录拒绝执行,登录后放行。
    提示:用一个全局变量模拟登录状态,装饰器内部判断状态后决定是否调用原函数。
    查看参考答案 ▼
    # 模拟登录状态 is_login = False def login_required(func): def inner(*args, **kwargs): if is_login: return func(*args, **kwargs) else: print("请先登录后再操作!") return inner @login_required def view_secret(): print("这是机密内容...") # 未登录调用 view_secret() # 输出: 请先登录后再操作! # 登录后调用 is_login = True view_secret() # 输出: 这是机密内容...