news 2026/6/9 6:49:47

ADVANCE Day26

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADVANCE Day26

@浙大疏锦行

📘 Day 26 实战作业:从“调包”到“造轮子” —— 函数专题 (上)

1. 作业综述

核心目标
从今天开始,我们将不再满足于调用print(),len()pandas.read_csv(),而是开始编写属于自己的自定义函数
这是构建大型项目(如我们之前的 ResNet 或 信贷预测 Pipeline)的基石。只有将复杂的逻辑封装成函数,代码才能具备复用性 (Reusability)可读性 (Readability)

涉及知识点

  • 函数定义:def关键字与文档字符串 (Docstring)。
  • 参数魔法: 位置参数、关键字参数、默认参数。
  • 无限接口:*args(可变位置参数) 与**kwargs(可变关键字参数) 的实战应用。

步骤 1:定义你的第一个工具

场景描述
在机器学习中,我们经常需要计算各种指标(如 Precision, Recall, F1)。
虽然sklearn有现成的,但为了理解原理,我们需要手写一个。

任务

  1. 编写一个函数calculate_f1(precision, recall)
  2. 要求
    • 包含清晰的文档字符串 (Docstring),说明参数和返回值。
    • 处理分母为 0 的情况(防止除零报错,返回 0)。
    • 返回计算好的 F1 分数。
defcalculate_f1(precision,recall):""" 计算 F1 Score 的自定义函数。 参数: precision (float): 精确率 recall (float): 召回率 返回: float: F1 Score。如果分母为0,则返回 0.0。 """# 1. 检查分母是否为 0if(precision+recall)==0:return0.0# 2. 计算公式: 2 * (P * R) / (P + R)f1=2*(precision*recall)/(precision+recall)returnf1# --- 测试你的工具 ---p=0.85r=0.76# 调用函数score=calculate_f1(p,r)print(f"Precision:{p}, Recall:{r}")print(f"F1 Score:{score:.4f}")# 测试极端情况print(f"极端情况 F1:{calculate_f1(0,0)}")
Precision: 0.85, Recall: 0.76 F1 Score: 0.8025 极端情况 F1: 0.0

步骤 2:灵活的默认参数

场景描述
写代码时,有些参数 90% 的情况都是固定的,但我们希望保留修改它的权利。
比如数据加载函数,默认读取.csv,但偶尔也需要读.txt

任务

  1. 编写函数mock_data_loader(file_path, mode='r', file_type='csv')
  2. 如果file_type是 ‘csv’,打印 “正在解析表格…”;如果是 ‘json’,打印 “正在解析字典…”。
  3. 分别使用默认参数修改参数的方式调用它。
defmock_data_loader(file_path,mode='r',file_type='csv'):""" 模拟数据加载器。 参数: file_path (str): 文件路径 mode (str): 打开模式,默认为 'r' (只读) file_type (str): 文件类型,默认为 'csv' """print(f"\n📂 正在打开文件:{file_path}(模式:{mode})")iffile_type=='csv':print(" > 正在解析 CSV 表格数据...")eliffile_type=='json':print(" > 正在解析 JSON 结构化数据...")else:print(f" > ⚠️ 未知文件类型:{file_type}")print(" ✅ 加载完成!")# --- 调用测试 ---# 1. 最简单的调用 (使用全部默认值)mock_data_loader("train_data.csv")# 2. 修改部分默认值 (关键字传参)mock_data_loader("config.json",file_type='json')# 3. 全部自定义mock_data_loader("log.txt",mode='w',file_type='text')
📂 正在打开文件: train_data.csv (模式: r) > 正在解析 CSV 表格数据... ✅ 加载完成! 📂 正在打开文件: config.json (模式: r) > 正在解析 JSON 结构化数据... ✅ 加载完成! 📂 正在打开文件: log.txt (模式: w) > ⚠️ 未知文件类型: text ✅ 加载完成!

步骤 3:万能接口*args**kwargs

场景描述
这是 Python 高级编程中最帅气的特性,在 PyTorch 和 Transformers 源码中随处可见。

  • *args: 用于接收任意数量的无名参数(打包成元组)。
  • **kwargs: 用于接收任意数量的键值对参数(打包成字典)。

任务
编写一个“超级模型训练器”train_model(model_name, *metrics, **config)

  1. model_name: 必填参数。
  2. *metrics: 接收任意数量的评估指标(如 “Accuracy”, “F1”, “AUC”)。
  3. **config: 接收任意数量的超参数(如 lr=0.01, batch_size=32)。
deftrain_model(model_name,*metrics,**config):print(f"\n🚀 开始训练模型: 【{model_name}】")# 1. 处理 *args (metrics)ifmetrics:print("📊 需要计算的指标:")forminmetrics:print(f" -{m}")else:print("⚠️ 未指定评估指标!")# 2. 处理 **kwargs (config)print("⚙️ 训练配置 (Hyperparameters):")forkey,valueinconfig.items():print(f"{key}:{value}")print("... 模型训练中 ...")print("✅ 训练结束!")# --- 实战调用 ---# 场景 A: 简单训练train_model("LogisticRegression","Accuracy",lr=0.1)# 场景 B: 复杂深度学习训练# 注意看:我可以传 2 个指标,也可以传 10 个配置,函数都能接得住!train_model("ResNet50","Accuracy","Precision","Recall","F1_Score",# *metricsbatch_size=64,# **configlearning_rate=0.001,optimizer="Adam",device="cuda:0")
🚀 开始训练模型: 【LogisticRegression】 📊 需要计算的指标: - Accuracy ⚙️ 训练配置 (Hyperparameters): lr: 0.1 ... 模型训练中 ... ✅ 训练结束! 🚀 开始训练模型: 【ResNet50】 📊 需要计算的指标: - Accuracy - Precision - Recall - F1_Score ⚙️ 训练配置 (Hyperparameters): batch_size: 64 learning_rate: 0.001 optimizer: Adam device: cuda:0 ... 模型训练中 ... ✅ 训练结束!

🎓 Day 26 总结:掌控代码的控制权

今天我们完成了一次身份的转变:

  1. 封装思维:通过def,我们将一堆代码打包成了一个function。以后遇到计算 F1 Score,直接调用即可,这就是DRY 原则 (Don’t Repeat Yourself)
  2. 接口设计
    • 默认参数让函数好用(大部分时候不用传参)。
    • *args/**kwargs让函数强大(想传多少传多少)。

深度学习伏笔
你今天写的train_model(name, *args, **kwargs)其实就是 PyTorch 中模型定义和训练循环的雏形。在后续的大型项目中,这种写法能让你的代码极具扩展性。

Next Level: 下一次,我们将探索函数的高阶玩法(Lambda, Map, Filter),让数据处理效率翻倍!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 8:04:18

Excalidraw垃圾回收机制:自动清理无效对象

Excalidraw垃圾回收机制:自动清理无效对象 在如今的远程协作场景中,可视化工具早已不只是“画图”那么简单。当一个团队在共享白板上反复增删元素、拖动连线、尝试AI生成的草图时,系统背后的数据状态可能早已变得错综复杂——那些被删除却仍藏…

作者头像 李华
网站建设 2026/6/8 12:17:35

Excalidraw代理模式设计:访问控制精细粒度

Excalidraw代理模式设计:访问控制精细粒度 在现代技术团队的日常协作中,可视化工具早已不再是“锦上添花”的辅助手段,而是推动产品设计、系统架构和跨职能沟通的核心载体。Excalidraw 以其手绘风格的亲和力与极简交互迅速赢得开发者青睐——…

作者头像 李华
网站建设 2026/6/8 10:06:50

Excalidraw最终一致性模型:保障数据完整性

Excalidraw最终一致性模型:保障数据完整性 在多人协作的数字白板场景中,一个看似简单的操作——比如两个人同时拖动同一个图形——背后却隐藏着复杂的分布式系统挑战。网络延迟、消息乱序、客户端临时断网……这些现实问题时刻威胁着用户体验与数据完整…

作者头像 李华
网站建设 2026/6/8 12:15:12

计算机网络--IPv4地址

目录 1.IPv4地址概述 2.表示方法 3.分类编址的IPv4地址 1.IPv4地址概述 在TCP/IP体系中,IP地址是一个最基本的概念,我们必须把它弄清楚。 ■ IPv4地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口分配一个在全世界范围 内是唯一的32比特的标识符。 IP地址…

作者头像 李华
网站建设 2026/6/9 3:13:13

Excalidraw负载均衡配置:应对高并发访问压力

Excalidraw 负载均衡配置:应对高并发访问压力 在现代远程协作日益频繁的背景下,可视化工具已成为团队沟通不可或缺的一环。Excalidraw 凭借其手绘风格、轻量设计和出色的实时协作能力,迅速成为技术架构图绘制、敏捷会议白板和产品原型草图的…

作者头像 李华
网站建设 2026/6/9 2:07:43

Excalidraw性能监控面板:实时查看GPU利用率

Excalidraw性能监控面板:实时查看GPU利用率 在AI功能加速融入各类创作工具的今天,一个看似简单的“手绘白板”应用也可能暗藏复杂的计算逻辑。以开源项目 Excalidraw 为例,它最初只是一个轻量级、风格化的在线画板,但随着社区为其…

作者头像 李华