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

Python训练营打卡 Day27

识点回顾:

  1. 装饰器的思想:进一步复用
  2. 函数的装饰器写法
  3. 注意内部函数的返回值

作业:

编写一个装饰器 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的返回值。

@浙大疏锦行

http://www.lryc.cn/news/608969.html

相关文章:

  • 【网络安全】日志文件格式
  • Linux 系统调用 stat 完全用例
  • Web前端文件上传安全与敏感数据安全处理
  • HiveMQ核心架构思维导图2024.9(Community Edition)
  • 反向代理+网关部署架构
  • 动态置信度调优实战:YOLOv11多目标追踪精度跃迁方案(附完整代码)
  • 关于corn
  • Android 之 图片加载(Fresco/Picasso/Glide)
  • 禁闭求生2 免安 中文 离线运行版
  • 【数据结构与算法】数据结构初阶:排序内容加餐(二)——文件归并排序思路详解(附代码实现)
  • 【LeetCode 热题 100】84. 柱状图中最大的矩形——(解法一)单调栈+三次遍历
  • 二叉树的锯齿形层次遍历
  • 9.苹果ios逆向-FridaHook-ios中的算法(CCCrypt)
  • CCF-GESP 等级考试 2025年6月认证C++一级真题解析
  • wordpress登陆前登陆后显示不同的顶部菜单
  • 最简单的零基础软件测试学习路线
  • Libevent(5)之使用教程(4)工具
  • k8s黑马教程笔记
  • 快速搭建一个非生产k8s环境
  • 【运维基础】Linux 硬盘分区管理
  • k8s+isulad 国产化技术栈云原生技术栈搭建4-添加worker节点
  • Hyper-V + Centos stream 9 搭建K8s集群(二)
  • k8s+isulad 国产化技术栈云原生技术栈搭建3-master节点安装
  • [硬件电路-148]:数字电路 - 什么是CMOS电平、TTL电平?还有哪些其他电平标准?发展历史?
  • Go语言实战案例:TCP服务器与客户端通信
  • 案例介绍|JSON数据格式的转换|pyecharts模块简介
  • Kafka——怎么重设消费者组位移?
  • 构建企业级Web应用:AWS全栈架构深度解析
  • AtCoder Beginner Contest 417
  • [硬件电路-147]:模拟电路 - DC/DC电压的三种架构:升压(Boost)、降压(Buck)或升降压(Buck-Boost)