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

Python训练营打卡Day30-文件的规范拆分和写法

知识点回顾
  1. 规范的文件命名
  2. 规范的文件夹管理
  3. 机器学习项目的拆分
  4. 编码格式和类型注解

机器学习项目的流程

一个典型的机器学习项目通常包含以下阶段:

①数据加载:从文件、数据库、API等获取原始数据。

命名参考:load_data.py、data_loader.py

②数据探索与可视化:了解数据特性,初期可用Jupyter Notebook,成熟后固化绘图函数。

命名参考:eda.py、visualization_utils.py

③数据预处理:处理缺失值、异常值,进行标准化、归一化、编码等操作。

命名参考:preprocess.py、data_cleaning.py、data_transformation.py

④特征工程:创建新特征,选择、优化现有特征。

命名参考:feature_engineering.py

⑤模型训练:构建模型架构,设置超参数并训练,保存型。

命名参考:model.py、train.py

⑥模型评估:用合适指标评估模型在测试集上的性能,生成报告。

命名参考:evaluate.py

⑦模型预测:用训练好的模型对新数据预测。

命名参考:predict.py、inference.py

文件的组织

①项目核心代码组织

②配置文件管理

③实验与探索代码

④项目产出物管理

总结一下通用的拆分起步思路:
1.首先,按照机器学习的主要工作流程(数据处理、训练、评估等)将代码分离到不同的 .py 文件中。这是最基本也是最有价值的一步。
2.然后,创建一个 utils.py 来存放通用的辅助函数。
3.考虑将所有配置参数集中到一个 config.py 文件中。
4.为你的数据和模型产出物创建专门的顶层目录,如 data/和 models/,将它们与你的源代码(通常放在src/目录)分开。

当遵循这些通用的拆分思路和原则时,项目结构自然会变得清晰。

注意事项

①if name == "main"

常常会看到if name == "main" 这个写法,实际上,每个文件都是一个对象,对象就会有属性和方法。如果直接运行这个文件,则_name_等于_main_,若这个文件被其他模块导入,则_name_不等于_main_。这个写法有如下好处:

1.明确程序起点:一个 Python 项目往往由多个模块组成。if name == "main" 可清晰界定程序执行的起始位置。比如一个包含数据处理模块data._procesing.py、模型训练模块 modeltraining,py的机器学习项目,在 model_training.py 中用 if name == "main" 包裹训练相关的主逻辑代码,运行该文件时就知道需要从这里开始执行(其他文件都是附属文件),让项目结构和执行流程更清晰。(大多时候如此)

2.避免执行:python遵从模块导入即执行机制,当你使用 import xx 导入一个模块时,Python 会执行该模块中的所有顶层代码(即不在任何函数或类内部的代码)。如果顶层代码中定义了全局变量或执行了某些操作(如读取文件、初始化数据库连接),这些操作会在导入时立即生效,并可能影响整个程序的状态。为了避免执行不必要的代码,我们可以使用 if name == "main" 来避免在导入时执行不必要的代码。这样,只有当模块被直接运行时(即被执行 python xx.py)才会执行顶层代码,而导入时则不会执行。这样,我们就可以确保在导入模块时,不会执行不必要的代码,从而提高程序的性能和可维护性。

3.合理的资源管理:if name == "main" 与定义 main 函数结合使用,函数内变量在函数执行完这些变量被释放,能及时回收内存资源,避免内存泄漏,保证程序高效运行。

②编码格式

规范的py文件,首行会有:#--coding:utf-8-

主要目的是显式声明文件的编码格式,确保 Python 解释器能正确读取和解析文件中的非 ASCII 字符(如中文、日文、特殊符号等)。也就是说这个是写给解释器看的。

因为,在 Python 2.x时代,默认编码是 ASCII,不支持直接在代码中写入非 ASCII 字符(如中文注释、字符串中的中文),否则会报错(syntaxErorr: Non-UTF-8 code starting with...)。但是python 3.x默认为 UTF-8 编码,理论上可以省略编码声明。但实际开发中,为了兼容旧代码、明确文件编码规则,或在团队协作中避免因编辑器/环境配置不同导致的乱码问题,许多开发者仍会保留这一行声明。
ps:
      1.编码声明必须出现在文件的前两行(通常是首行),否则会被忽略。
      2.如果编码格式没问题,可能是vscode的编码格式不是utf-8,可以尝试修改编码格式。
      3.常见的编码报错是因为字符串编码问题,可以尝试显式转化,即读取的时候转化为utf-8编码。

非 ASCII 字符的代码如下所示:

# -*- coding: utf-8 -*-
msg = "你好,世界!"  # 中文字符串
print(msg)

③类型注解

Python 的类型注解是在 Python 3.5+ 引入的特性,用于为变量、函数参数、返回值和类属性等添加类型信息。虽然 Python 仍是动态类型语言,但类型注解可以提高代码可读性、可维护性,并支持静态类型检查工具(如 mypy)。

其次你在安装 python 插件的时候,附带安装了2个插件

1.一个是 python debugger 用于断点调试,我们已经介绍了
2.另一个是pylance,用于代码提示和类型检查,这个插件会根据你的代码中的类型注解,给出相应的提示和检查,比如你定义了一个函数,参数类型是int,那么当你传入一个字符串时,它会提示你传入的参数类型不正确。

变量类型注解语法为 变量名:类型

# 变量的类型注解
name: str = "Alice"
age: int = 30
height: float = 1.75
is_student: bool = False

函数类型注解为函数参数和返回值指定类型,语法为 def函数名(参数: 类型)->返回类型。

def add(a: int, b: int) -> int:return a + bdef greet(name: str) -> None:print(f"Hello, {name}")

类属性与方法的类型注解:为类的属性和方法添加类型信息。

# 定义一个矩形类
class Rectangle:width: float      # 矩形宽度(浮点数),类属性的类型注解(不初始化值)height: float     # 矩形高度(浮点数)def __init__(self, width: float, height: float):self.width = widthself.height = heightdef area(self) -> float:# 计算面积(宽度 × 高度)return self.width * self.height

@浙大疏锦行

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

相关文章:

  • 543.二叉树的直径
  • 【前端:Html】--2.进阶:表单
  • 数字孪生重构园区管理效率:技术落地与产业升级的三重跃迁
  • JVM学习笔记-----图解方法执行流程
  • Nginx 启用 HTTPS:阿里云免费 SSL 证书详细图文教程(新手0.5小时可完成)
  • openssl中,公钥和私钥的区别和作用?
  • API 接口接入开发全演示:淘宝商品数据实时抓取
  • 代码随想录刷题Day29
  • 基于51单片机220V交流电流检测系统过流阈值报警设计
  • 通信接口与通信约规
  • 【牛客刷题】REAL806 放它一马:怪物经验值最大化策略详解
  • 【基于DesignStart的M3 SoC】
  • 终端安全检测和防御技术
  • UGUI源码剖析(6):遮罩的“魔法”与“算法”——从C#到Shader,彻底揭示Mask与RectMask2D的原理
  • OpenHarmony编译与烧录
  • HTTPS服务
  • MCU外设初始化:为什么参数配置必须优先于使能
  • Ceph的FileStore存储引擎详解
  • 如何提升需求分析能力
  • NLP—词向量转换评论学习项目分析
  • 【SpringBoot】05 容器功能 - SpringBoot底层注解的应用与实战 - @Configuration + @Bean
  • IIS Express中可以同时加载并使用.net4.0和.NET 2.0的 DLL
  • 面试八股之从jvm层面深入解析Java中的synchronized关键字
  • 使用pyqt5实现可勾选的测试用例界面
  • MM DEMO-2025 | 北航新融合LLM与多模态交互的无人机导航系统!AirStar,智能空中助手等你来体验
  • 前端/在vscode中创建Vue3项目
  • NoC设计中Router Table的作用
  • Day05 店铺营业状态设置 Redis
  • 【C++】迭代器失效问题
  • THCV215一种高速视频数据收发器,采用低电压差分信号(LVDS)技术支持高速串行数据传输,支持1080p/60Hz高分辨率传输