公司动态
Python 30 分钟速通:AI 开发用到的语法就够了
本文专为 AI/机器学习新手打造——不教你做网站不教你写爬虫只讲 NumPy、Pandas、PyTorch 中高频出现的 Python 语法。看完就能读懂 AI 代码写完就能跑实验。目录前言学 Python 不是为了当全栈是为了跑 AI第一章变量、类型与运算符5 分钟第二章列表、元组、字典——AI 中的三大容器7 分钟第三章条件、循环与推导式5 分钟第四章函数、Lambda 与作用域5 分钟第五章类与面向对象——理解 nn.Module 的前提4 分钟第六章文件读写与路径操作2 分钟第七章类型注解——你以后每行代码都会用到2 分钟总结一张语法速查表前言学 Python 不是为了当全栈是为了跑 AI一个浪费你时间的真相大多数 Python 入门课都在教你写 2048 小游戏、爬豆瓣电影、做 Flask 博客。这些当然有价值——但对 AI 开发来说80% 的内容你用不上。AI 开发真正需要的 Python 语法其实少得惊人NumPy 操作矩阵 → 需要列表、切片、索引PyTorch 定义模型 → 需要类继承、__init__、forward()DataLoader 加载数据 → 需要yield、__getitem__训练循环 → 需要 for 循环、条件判断画 loss 曲线 → 需要列表、matplotlib 调用本文的设计原则只讲 AI 中用到的不讲多余内容每个知识点都对应一个真实的 AI 场景让你知道这个语法在 AI 中怎么用代码都可直接复制运行无需安装任何 AI 库读完就能读懂 PyTorch 官方教程和 GitHub 上的 AI 项目代码环境准备安装 Python 3.10打开终端输入python进入交互模式或者用 VS Code / Jupyter Notebook 跟着敲。第一章变量、类型与运算符5 分钟1.1 变量与基本类型Python 是动态类型语言不需要声明类型但理解类型至关重要。# 数字 epochs 100 # int——训练轮数 learning_rate 0.001 # float——学习率 batch_size 32 # int——批大小 # 字符串 model_name ResNet-50 dataset_path rC:\data\images # 原始字符串Windows 路径必备 log_msg fEpoch {epochs}, lr{learning_rate} # f-string日志必备 # 布尔 use_gpu True training_complete False # None best_accuracy None # 常用于初始化暂无最佳结果AI 场景lr,epochs,batch_size这三个变量会出现在 100% 的 AI 训练脚本里。1.2 常用运算符# 算术 total 32 * 100 # batch_size * epochs 3200 # 比较——输出布尔值 if accuracy 0.95: print(模型已达到目标精度) # 整除和取余——用于数据分片 samples 105 batch_size 32 n_batches samples // batch_size # 3整除105÷323 余 9 remainder samples % batch_size # 9余数 # in 运算符——检查元素是否存在 allowed_models [ResNet, VGG, EfficientNet] if ResNet in allowed_models: print(可以使用此模型) # is vs a None if a is None: # ✅ 判断 None 用 is不要用 print(未赋值)1.3 Python 的假值在if判断中以下值被视为False# 以下全部为 False bool(0) bool(0.0) bool() # 空字符串 bool([]) # 空列表 bool({}) # 空字典 bool(None) # AI 中的经典用法检查列表是否为空 predictions [] if not predictions: # 等价于 if len(predictions) 0 print(还没有预测结果)第二章列表、元组、字典——AI 中的三大容器7 分钟2.1 列表List——最常用的数据结构# 创建列表 metrics [accuracy, precision, recall, f1] layer_sizes [784, 128, 64, 10] # 输入784 → 隐层128 → 隐层64 → 输出10 loss_history [] # 空列表训练中动态添加 loss # 索引——从 0 开始 first_layer layer_sizes[0] # 784 last_layer layer_sizes[-1] # 10负数索引从末尾开始 # 切片——AI 代码中最高频操作 train_data list(range(1000)) # [0, 1, 2, ..., 999] train_80 train_data[:800] # 前 800 个切片 [0:800] val_20 train_data[800:] # 后 200 个切片 [800:] batch_1 train_data[0:32] # 第一个 batch[0, 1, ..., 31] batch_2 train_data[32:64] # 第二个 batch[32, 33, ..., 63] # 切片三参数 [start:end:step] every_other train_data[::2] # 隔一个取一个 reversed_data train_data[::-1] # 倒序 # 列表操作 loss_history.append(0.56) # 在末尾添加 loss_history.append(0.43) last_loss loss_history.pop() # 弹出最后一个 0.43 # 列表拼接 all_classes [cat] [dog] [bird] # [cat, dog, bird]AI 场景train_data[:800]是手动划分训练集/验证集的经典写法append()在每个 epoch 结束时记录 loss[::-1]在序列数据倒序时有奇效。2.2 多维列表模拟矩阵# 3×3 矩阵——在学 NumPy 之前先用列表理解 matrix [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] # 访问元素 element matrix[1][2] # 第 2 行第 3 列 → 6 # 提取某一列列表推导式第三章讲 col_1 [row[0] for row in matrix] # [1, 4, 7]2.3 元组Tuple——不可变的列表# 创建——用逗号或括号 image_shape (224, 224) # 图像尺寸 H×W color_rgb (255, 0, 0) # RGB 颜色 model_output (prob, class_id) # 同时返回概率和类别 # 解包unpacking——AI 代码中的高频模式 height, width image_shape # height224, width224 prob, class_id model_output # 同时赋值给两个变量 # 函数返回多值时本质是返回元组 def predict(image): return 0.95, 3 # 返回 (prob, class_id) confidence, predicted_class predict(img) # 解包接收AI 场景(3, 224, 224)是典型的 RGB 图像张量形状nn.Sequential的参数就是各层组成的元组DataLoader 的batch_size等参数常以元组传递。2.4 字典Dict——键值对的容器# 创建——AI 配置文件的天然载体 config { model: ResNet-18, epochs: 100, batch_size: 32, learning_rate: 0.001, optimizer: Adam, use_gpu: True } # 访问 print(config[model]) # ResNet-18 print(config.get(dropout, 0.5)) # 如果 key 不存在返回默认值 0.5 # 修改和添加 config[epochs] 200 # 修改 config[weight_decay] 1e-4 # 新增 # 遍历 for key, value in config.items(): print(f{key}: {value}) # AI 中超参数搜索的经典模式 hyperparams {lr: 0.001, bs: 32, layers: 3} for param_name, param_value in hyperparams.items(): print(f正在测试 {param_name}{param_value})AI 场景模型配置文件model card、train_args天然用字典存储state_dict()保存模型权重时返回的就是字典kwargs参数传递整个配置字典。第三章条件、循环与推导式5 分钟3.1 if-elif-else 条件判断# 基础 accuracy 0.93 if accuracy 0.95: print(✅ 模型可以上线) elif accuracy 0.90: print(⚠️ 模型达标建议继续优化) else: print(❌ 精度不足需要重训) # 条件表达式三目运算符 status 合格 if accuracy 0.90 else 不合格AI 场景早停Early Stopping的核心逻辑就是用if判断验证集 loss 是否不再下降。3.2 for 循环——训练的核心# 遍历列表 for epoch in range(1, 11): # 1 到 10 print(f第 {epoch} 轮训练) # 同时遍历索引和值——enumerate models [CNN, RNN, Transformer] for i, name in enumerate(models): print(f模型 {i}: {name}) # 模型 0: CNN, 模型 1: RNN, ... # 同时遍历两个列表——zipDataLoader 底层原理 losses [0.8, 0.5, 0.3] accuracies [0.6, 0.8, 0.9] for loss, acc in zip(losses, accuracies): print(fLoss: {loss}, Acc: {acc}) # 提前结束训练 for epoch in range(100): loss 0.01 / (epoch 1) # 模拟 loss 下降 if loss 0.001: print(f第 {epoch} 轮loss 已收敛停止训练) break # 提前退出循环 # 跳过本轮继续下一轮 for i, sample in enumerate(data): if sample is None: continue # 跳过无效样本 process(sample)AI 场景训练循环for epoch in range(epochs): for batch in dataloader:是每个 AI 项目的 DNA。enumerate和zip是 DataLoader 内部实现的关键语法。3.3 推导式——AI 代码中最 Pythonic 的写法推导式是 Python 最优雅的特性之一也是 AI 数据处理中最高频的单行代码模式。# 列表推导式最常用 # 基础对每个元素做操作 import math values [1.0, 4.0, 9.0, 16.0] sqrt_values [math.sqrt(x) for x in values] # [1.0, 2.0, 3.0, 4.0] # 带 if 条件 scores [0.45, 0.89, 0.63, 0.92, 0.38] high_scores [s for s in scores if s 0.8] # [0.89, 0.92] # 带 if-else 条件注意语序不同 labels [合格 if s 0.6 else 不合格 for s in scores] # [不合格, 合格, 合格, 合格, 不合格] # 嵌套循环展开 classes [猫, 狗] colors [黑, 白] combinations [f{c}{d} for c in colors for d in classes] # [黑猫, 黑狗, 白猫, 白狗] # 数据预处理中的经典用法 import random augmented_data [x random.uniform(-0.1, 0.1) for x in train_data] # 字典推导式 class_names {0: cat, 1: dog, 2: bird} # 键值反转 id_to_name {v: k for k, v in class_names.items()} # {cat: 0, dog: 1, bird: 2} # 从列表中构建统计字典 predictions [cat, dog, cat, bird, cat] count {cls: predictions.count(cls) for cls in set(predictions)} # {cat: 3, dog: 1, bird: 1}AI 场景数据预处理标准化、归一化几乎全靠列表推导式混淆矩阵统计、分类结果格式化也是推导式的天下。看不懂推导式 看不懂 50% 的 AI 数据预处理代码。第四章函数、Lambda 与作用域5 分钟4.1 函数定义# 基本函数 def compute_accuracy(predictions, targets): 计算分类准确率 correct sum(1 for p, t in zip(predictions, targets) if p t) return correct / len(targets) result compute_accuracy([1, 0, 2], [1, 1, 2]) # 0.6667 # 默认参数 def create_optimizer(nameAdam, lr0.001, weight_decay0.0): 创建优化器配置 return {name: name, lr: lr, weight_decay: weight_decay} opt1 create_optimizer() # 全部使用默认值 opt2 create_optimizer(nameSGD, lr0.01) # 覆盖部分参数AI 场景forward(),train_step(),validate()——一切 AI 逻辑都封装在函数中。4.2*args和**kwargs——AI 框架的万能参数# *args——接收任意数量的位置参数 def print_layers(*layer_sizes): 打印网络各层大小 for i, size in enumerate(layer_sizes): print(fLayer {i}: {size}) print_layers(784, 256, 128, 10) # Layer 0: 784 # Layer 1: 256 # Layer 2: 128 # Layer 3: 10 # **kwargs——接收任意数量的关键字参数 def build_model(**kwargs): 构建模型配置 name kwargs.get(name, Unknown) pretrained kwargs.get(pretrained, False) print(f模型: {name}, 预训练: {pretrained}) return kwargs config build_model(nameResNet-50, pretrainedTrue, num_classes1000) # 解包字典传给函数——常见于传递训练参数 train_args {lr: 0.001, epochs: 50, batch_size: 32} def train(**kwargs): for k, v in kwargs.items(): print(f{k} {v}) train(**train_args) # 将字典展开为关键字参数AI 场景PyTorch 的nn.Module.__init__()大量使用**kwargs传递可变配置DataLoader的参数本质上就是**kwargs展开。4.3 Lambda 表达式——匿名函数# 基础语法 square lambda x: x * x print(square(5)) # 25 # 主要用在 sorted/map/filter 中 # 按准确率排序模型 models [(CNN, 0.92), (RNN, 0.85), (Transformer, 0.96)] sorted_models sorted(models, keylambda m: m[1], reverseTrue) # [(Transformer, 0.96), (CNN, 0.92), (RNN, 0.85)] # 过滤低置信度预测 probs [0.23, 0.87, 0.45, 0.91] high_conf list(filter(lambda x: x 0.5, probs)) # [0.87, 0.91] # 数据转换map scaled list(map(lambda x: x * 2, [1, 2, 3])) # [2, 4, 6]AI 场景sorted(dataloader, keylambda x: x[0].shape[1])按序列长度排序NLP 中做 bucketing自定义 DataLoader 排序规则。4.4 作用域——变量的可见范围# 全局变量 GLOBAL_SEED 42 # 约定全大写变量名表示常量 def set_seed(): local_var 42 # 局部变量函数外不可见 print(GLOBAL_SEED) # 可以读取全局变量 def update_global(): global GLOBAL_SEED GLOBAL_SEED 999 # 修改全局变量必须先声明AI 场景随机种子RANDOM_SEED通常定义为全局常量torch.no_grad()改变局部梯度行为本质上是 Python 上下文管理器。第五章类与面向对象——理解nn.Module的前提4 分钟5.1 为什么学类当你打开 PyTorch 官方教程第一眼看到的就是class MyModel(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(3, 64, 3) def forward(self, x): return self.conv1(x)如果你不直到class,__init__,self,super()是什么这段代码就是天书。下面 3 分钟解决它。5.2 类的定义、初始化与方法class SimpleModel: 一个简单的模型基类模拟 # __init__ 构造函数创建对象时自动调用 def __init__(self, input_dim, output_dim): self.input_dim input_dim # self.xxx 实例属性 self.output_dim output_dim self.is_training True # 默认训练模式 print(f模型初始化: {input_dim} → {output_dim}) # 普通方法——第一个参数必须是 self def train(self): self.is_training True print(切换到训练模式) def eval(self): self.is_training False print(切换到评估模式) def forward(self, x): 模拟前向传播 return f处理输入 {x}输出维度 {self.output_dim} # 使用 model SimpleModel(784, 10) # 自动调用 __init__ # 输出模型初始化: 784 → 10 model.train() result model.forward([1, 2, 3]) print(result) # 处理输入 [1, 2, 3]输出维度 10核心理解self就是这个对象自己。self.input_dim让你在类的任何方法中都能访问这个属性。5.3 继承——AI 框架的基石class BaseModel: def __init__(self, name): self.name name def save(self): return f{self.name} 已保存 # 继承——CNN 是 Model 的子类 class CNN(BaseModel): def __init__(self, name, num_layers): super().__init__(name) # 调用父类的 __init__ self.num_layers num_layers # 子类新增属性 def forward(self, x): return fCNN ({self.name}) 处理 {x}共 {self.num_layers} 层 cnn CNN(MyCNN, 18) print(cnn.save()) # MyCNN 已保存——继承自 BaseModel print(cnn.forward(image)) # CNN 自己的方法AI 场景class MyModel(nn.Module)就是继承super().__init__()是标准写法不能省略自定义模型只需重写__init__和forward。5.4 魔术方法——让对象自带行为class Metrics: def __init__(self): self.data [] # __len__让 len(obj) 生效 def __len__(self): return len(self.data) # __getitem__让 obj[i] 生效DataLoader 的核心 def __getitem__(self, index): return self.data[index] # __str__让 print(obj) 输出有意义的信息 def __str__(self): return fMetrics({len(self)} items) # __call__让对象能像函数一样被调用 def __call__(self, x): self.data.append(x) return x m Metrics() m(0.85) # __call__ 被调用 m(0.92) print(len(m)) # 2 —— __len__ 被调用 print(m[0]) # 0.85 —— __getitem__ 被调用 print(m) # Metrics(2 items) —— __str__ 被调用AI 场景__getitem__是 PyTorchDataset子类必须实现的方法__call__让model(x)等价于model.forward(x)__len__让len(dataset)返回数据集大小。第六章文件读写与路径操作2 分钟6.1 读文件# 读取整个文件 with open(config.yaml, r, encodingutf-8) as f: content f.read() # 逐行读取——处理大型 CSV/JSONL 数据集 with open(train_data.jsonl, r, encodingutf-8) as f: for line in f: data line.strip() # 去掉末尾换行符 if data: # 跳过空行 process(data) # 读取 CSV——初学用 csv 模块进阶用 pandas见下一篇 import csv with open(labels.csv, r) as f: reader csv.reader(f) header next(reader) # 跳过表头 for row in reader: image_path, label row[0], row[1]6.2 写文件# 写训练日志 with open(training_log.txt, w, encodingutf-8) as f: f.write(Epoch, Loss, Accuracy\n) for epoch in range(1, 6): loss 1.0 / epoch acc 1.0 - loss f.write(f{epoch}, {loss:.4f}, {acc:.4f}\n)6.3 路径操作import os from pathlib import Path # 推荐用 pathlib跨平台无痛 # 路径拼接——不要手动拼字符串 data_dir Path(C:/projects/data) image_dir data_dir / images / train # 用 / 拼接 label_file data_dir / labels.csv # 检查路径 if image_dir.exists(): print(f数据目录存在: {image_dir}) # 列出所有文件 image_files list(image_dir.glob(*.jpg)) # 所有 jpg 图片 print(f找到 {len(image_files)} 张图片) # 获取文件名和扩展名 for img_path in image_files: name img_path.stem # 文件名不含扩展名 ext img_path.suffix # 扩展名 .jpg parent img_path.parent # 所在目录AI 场景Path是处理数据集的标配工具glob(*.jpg)遍历图片文件夹是最常见的操作/拼接路径告别 Windows/Linux 反斜杠问题。第七章类型注解——你以后每行代码都会用到2 分钟7.1 为什么类型注解对 AI 开发至关重要AI 代码中到处都是Tensor,ndarray,DataLoader……如果没有类型提示你根本不知道一个函数的输入到底是什么形状。from typing import List, Tuple, Optional, Dict, Union, Any # 基础类型注解 def compute_loss( predictions: List[float], # float 列表 targets: List[float], reduction: str mean # 字符串默认 mean ) - float: # 返回 float 计算均方误差 n len(predictions) squared_errors [(p - t) ** 2 for p, t in zip(predictions, targets)] if reduction mean: return sum(squared_errors) / n return sum(squared_errors) # 复杂类型——AI 代码标配 Config Dict[str, Any] # 自定义类型别名 # Config {lr: 0.001, epochs: 100, ...} def create_dataloader( data_dir: str, batch_size: int 32, shuffle: bool True ) - Tuple[List, List]: 返回 (train_data, val_data) 元组 pass # Optional——可能为 None def load_checkpoint(path: str) - Optional[Dict]: 加载模型检查点文件不存在时返回 None import os if not os.path.exists(path): return None return {epoch: 10, state_dict: {}} # Union——多种类型之一 def scale_input(x: Union[int, float, List[float]]) - List[float]: 输入可以是单个数字或列表 if isinstance(x, list): return [v * 2 for v in x] return [x * 2]AI 场景现代 AI 代码库HuggingFace Transformers、PyTorch 官方示例几乎 100% 使用类型注解。不写注解 维护的人包括 3 个月后的你自己会骂你。总结一张语法速查表AI 开发核心 Python 语法对照语法AI 中的典型场景出现频率for epoch in range(N)训练循环⭐⭐⭐⭐⭐for batch in dataloader批数据迭代⭐⭐⭐⭐⭐list[i:j]切片划分训练集/验证集⭐⭐⭐⭐⭐[f(x) for x in data if ...]数据预处理、过滤⭐⭐⭐⭐⭐f{name}_{epoch}f-string日志、模型保存命名⭐⭐⭐⭐⭐class Model(nn.Module)定义神经网络⭐⭐⭐⭐⭐def forward(self, x)前向传播⭐⭐⭐⭐⭐dict[key]/.get(key, default)模型配置、超参存储⭐⭐⭐⭐a, b tuple解包DataLoader 返回 (x, y)⭐⭐⭐⭐with open(...) as f读写配置文件、数据文件⭐⭐⭐⭐lambda x: ...sorted/map/filter 辅助⭐⭐⭐*args, **kwargs灵活传参训练配置⭐⭐⭐Path(.) / data跨平台路径管理⭐⭐⭐- Tensor:类型注解代码可读性和 IDE 提示⭐⭐⭐⭐try/except异常处理容错加载数据、文件⭐⭐⭐你还需要知道的但本文没展开的话题本文为何不展开替代方案装饰器AI 代码中偶见torch.no_grad()用到了再查知道是包装函数即可生成器yieldDataLoader 底层用但初学直接用for遍历下一篇 Pandas 会涉及多线程/多进程DataLoader 的num_workers参数涉及但框架封装好了你只需设num_workers4正则表达式文本预处理偶用但有更简单的 str 方法用到时 ChatGPT 帮你写import深入知道import torch就够了进阶时自然就懂了版权声明本文为原创内容代码可自由使用。转载请标注出处。Python 30 分钟速通AI 开发用到的语法就够了