Python训练营打卡 Day27
知识点回顾:
- 装饰器的思想:进一步复用
- 函数的装饰器写法
- 注意内部函数的返回值
作业:
编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值),要求:
代码:
def logger(func): def wrapper(*args,**kwargs):print(f"开始执行函数{func.__name__},参数{args},{kwargs}\n")result = func(*args,**kwargs)print(f"函数{func.__name__}执行完毕,返回值:{result}")return resultreturn wrapper@logger
def multiply(a,b):return a * bmultiply(2,3)
运行结果:
笔记
不带参数的装饰器:
大白话版框架:
def 装饰器(原函数): # ① 接收原函数def 任意名字1(): # ② 定义包装函数# ...添加新功能...return 原函数() # ③ 调用原函数return 任意名字1 # ④ 返回包装函数(未调用)
例:
import time #装饰器函数的功能是计时def display_time(func):def wrapper():start_time = time.time()func()end_time = time.time()print(f"执行时间:{end_time-start_time}秒")return wrapperdef is_prime(num):"""判断一个函数是否为质数"""if num < 2:return Falseelif num == 2:return Trueelse:for i in range(2,num):if num % i == 0:return Falsereturn True@display_time
def prime_nums():""""找出2到10000之间的所有质数并打印"""for i in range(2,10000):if is_prime(i):print(i)prime_nums()
- 核心的功能是判断素数函数,返回值是判断结果(是/不是)
- 将该功能在2~10000循环就是打印函数,没有输入参数也没有返回值
- 装饰器函数的输入是打印函数,输出是执行时间。
带参数的装饰器:
大白话版框架:
def 带参装饰器(装饰器参数): # 这层接收装饰器的参数def 装饰器本体(原函数): # 这层接收被装饰的函数def 包装函数(*args, **kwargs): # 这层接收函数参数# 这里能使用装饰器参数和函数参数return 原函数(*args, **kwargs)return 包装函数return 装饰器本体
例:
def 计时装饰器(单位='毫秒'): # ① 接收装饰器参数def 装饰器(原函数): # ② 接收原函数def 包装器(*args, **kwargs): # ③ 接收函数参数import timestart = time.time()result = 原函数(*args, **kwargs)end = time.time()print(f"耗时:{end-start}{单位}")return resultreturn 包装器return 装饰器@计时装饰器(单位='毫秒') # 使用装饰器时传参
def 加法(a, b):return a + b
- 核心功能是加法,让加法函数保持简洁
- 加法有输入参数,用*args和**kwarg接收
- 在装饰器中运行原函数时的代码也写result = func(*args和**kwarg),并且result是wrapper的返回值。
@浙大疏锦行