浙大疏锦行今日内容核心装饰器Decorator1. 装饰器是什么本质一个函数它接收另一个函数作为参数返回一个新函数通常叫wrapper在不修改原函数代码的前提下为原函数增加额外功能如计时、日志、权限校验等。目的遵循DRY 原则Don’t Repeat Yourself将重复的辅助逻辑如计时抽离出来让核心函数更干净、可读性更强。2. 装饰器的基本结构无参数、无返回值defdisplay_time(func):defwrapper():# 前置操作starttime.time()func()# 调用原函数# 后置操作print(time.time()-start)returnwrapper# 返回新函数而非执行它使用display_time语法糖等价于prime_nums display_time(prime_nums)。调用prime_nums()时实际执行的是wrapper()。3. 带参数的被装饰函数如何处理wrapper(*args, **kwargs)接收任意位置参数和关键字参数然后原样传给func(*args, **kwargs)。这样装饰器就可以复用于任何参数形式的函数。4. 带返回值的被装饰函数如何处理wrapper中需要result func(...)并return result保证原函数的返回值能传递出去。5. 执行顺序单步调试会看到定义display_time定义prime_nums并立即应用display_time→ 执行display_time(prime_nums)得到wrapper此时prime_nums这个名字被重新绑定到wrapper调用prime_nums()→ 进入wrapper→ 执行计时 → 调用原始的prime_nums即func→ 打印质数 → 输出耗时你笔记中range(2, num)的运用在判断素数is_prime(num)中foriinrange(2,num):ifnum%i0:returnFalserange(2, num)生成从 2 到num-1的整数序列用于测试所有可能的除数。如果num能被其中任何一个数整除则不是素数否则是素数。注意num2时range(2,2)为空循环不执行直接返回True所以笔记中单独处理了num2。装饰器与普通函数计时对比普通写法计时代码混在prime_nums内部干扰核心逻辑。装饰器写法计时逻辑独立成display_timeprime_nums只关心找质数代码更清晰且计时功能可复用于其他函数。今日总结一句话装饰器是“函数的函数”通过语法糖将原函数包装在不改动原函数内部代码的情况下为其增加额外能力。理解其本质是func decorator(func)的替换过程并掌握*args, **kwargs传递参数以及return返回值就能应对绝大多数场景。今日作业def logger(func):def wrapper(*args, **kwargs):print(f开始执行函数 {func.name}参数: {args}, {kwargs}“)result func(*args, **kwargs)print(f函数 {func.name} 执行完毕返回值: {result}”)return resultreturn wrapperloggerdef multiply(a, b):return a * bmultiply(2, 3)