Python 核心知识速查手册 (AI 开发者进阶版)
·
适用人群:有一定基础但概念模糊的 AI 大模型开发者、职场转型人士
用途:作为开发过程中的语法速查表与概念深化指南
版本:基于 Python 3.x (融合 Anaconda/PyCharm 最佳实践)
核心理念:从“会写代码”到“理解工程架构”
文章目录
1. 环境准备与语言概览
1.1 为什么选择 Python?
- 起源:1989年由 Guido van Rossum 发明,1991年发布。
- 定位:面向对象、解释型、动态类型语言。
- AI 地位:凭借简洁的语法(“人生苦短,我用 Python”)和庞大的生态(PyTorch, TensorFlow, HuggingFace),成为人工智能领域的绝对通用语。
- 解析器:最常用的是 CPython(官方 C 语言实现)。
- 版本警示:Python 3.x 不兼容 Python 2.x,目前所有 AI 框架均基于 Python 3.8+。
1.2 开发环境搭建 (职场标准)
在 AI 工程中,直接安装原生 Python 往往不够,推荐使用发行版 + IDE + 虚拟环境的组合。
| 组件 | 推荐方案 | 作用 |
|---|---|---|
| 发行版 | Anaconda / Miniconda | 预装了科学计算包 (NumPy, Pandas),自带包管理器 conda,解决依赖冲突的神器。 |
| IDE | PyCharm (专业版/社区版) | 智能补全、调试器、远程服务器连接,是编写复杂 AI 代码的首选。 |
| 虚拟环境 | conda create -n ai_env python=3.9 |
隔离项目依赖。避免不同项目间的库版本冲突(如项目 A 需 PyTorch 1.0,项目 B 需 2.0)。 |
| 关联配置 | PyCharm -> Settings -> Project Interpreter | 将 IDE 指向你创建的虚拟环境 (ai_env),确保代码运行在正确的环境中。 |
2. 基础语法规范
2.1 注释 (Documentation)
代码是写给人看的,顺便给机器执行。良好的注释是团队协作的基础。
- 单行注释:使用
# - 多行注释/文档字符串:使用
'''内容'''或"""内容"""(常用于函数说明)
# 这是一个单行注释
print("Hello AI")
"""
这是一个多行注释 (文档字符串)
常用于函数或类的开头,描述其功能、参数和返回值
"""
2.2 标识符与变量 (Variables & Identifiers)
-
标识符:程序中所有的名字(变量名、函数名、类名)。
- 硬性规则:只能由字母、数字、下划线、汉字组成;不能以数字开头;严格区分大小写;不能使用关键字 (如
if,class)。 - 命名规范:
- 蛇形命名法 (snake_case):
student_name,model_config(Python 官方推荐,用于变量和函数)。 - 大驼峰命名法 (PascalCase):
StudentName,LLMModel(用于类名)。 - 建议:尽量避免使用中文命名变量,虽然 Python 支持,但在跨平台或某些库中可能引发编码问题。
- 蛇形命名法 (snake_case):
- 硬性规则:只能由字母、数字、下划线、汉字组成;不能以数字开头;严格区分大小写;不能使用关键字 (如
-
变量定义:
变量名 = 值(动态类型,无需声明)。- 字面量:代码中直接写下的固定值,如
"你好",10,3.14,True。 - 注意:变量本身没有类型,它指向的对象才有类型。
- 字面量:代码中直接写下的固定值,如
age = 25 # int (整数)
price = 99.5 # float (浮点数)
is_ai = True # bool (布尔值)
name = "Qwen" # str (字符串,单双引号均可)
# 查看类型
print(type(age)) # <class 'int'>
2.3 数据类型转换
AI 数据处理中经常需要在不同格式间切换。
str(x): 任意类型转字符串。int(x): 转整数。注意:浮点数转整数会丢弃小数部分(非四舍五入);中文字符串无法转换。float(x): 转浮点数。整数转浮点类似乘以 1.0。
s_num = "100"
n_num = int(s_num) + 50 # 必须转换才能计算,结果 150
f_val = float("3.14")
i_val = int(3.99) # 结果是 3,不是 4
2.4 输入与输出 (I/O)
- 输出
print():*args: 可打印多个内容。sep: 分隔符,默认是空格。end: 结尾符,默认是换行\n。
- 输入
input():- 关键陷阱:
input()接收到的永远是字符串 (str)。若需数值计算,必须强制转换。
- 关键陷阱:
# 输出示例
print("Name:", "AI", "Dev", sep='|', end='!\n')
# 输出: Name|AI|Dev!
# 输入示例
user_age = input("请输入年龄: ") # 用户输入 25,得到的是 "25" (str)
next_year = int(user_age) + 1 # 必须转为 int
print(f"明年你 {next_year} 岁")
2.5 运算符
- 算术:
+,-,*,/(浮点除),//(整除),%(取模),**(幂)。 - 赋值:
=,+=,-=,*=, etc. - 比较:
==,!=,>,<,>=,<=。 - 逻辑:
and(与),or(或),not(非)。 - 随机数:需导入
random模块。import random num = random.randint(1, 100) # 生成 1-100 的随机整数
3. 流程控制 (Flow Control)
3.1 选择结构 (If-Else)
- 核心:依靠缩进表示代码块,不使用
{}。 - 逻辑:
if->elif(多个条件) ->else(兜底)。 - 嵌套:if 语句内部可以再次包含 if 语句。
score = 85
if score >= 90:
print("优秀 (A)")
elif score >= 60:
print("及格 (C)")
# 可以在这里嵌套判断
if score >= 80:
print("良 (B)")
else:
print("不及格 (F)")
3.2 循环结构
For 循环
- 用于遍历可迭代对象(列表、字符串、range、字典等)。
- Range 函数:
range(start, stop, step)-> 左闭右开 (含 start,不含 stop)。
# 遍历字符串
for char in "Python":
print(char, end='-') # P-y-t-h-o-n-
# 数字循环 0 到 4
for i in range(5):
print(i, end=' ') # 0 1 2 3 4
# 控制关键字
# break: 彻底结束整个循环
# continue: 跳过本次剩余代码,直接进入下一次循环
for i in range(5):
if i == 3:
continue # 跳过 3
if i == 4:
break # 遇到 4 直接停止
print(i) # 输出: 0 1 2
While 循环
- 只要条件为
True,一直执行。 - 警惕死循环:确保循环体内有改变条件的逻辑。
count = 0
while count < 3:
print(f"Count: {count}")
count += 1 # 必须更新条件,否则死循环
💡 实战案例:猜数字游戏
结合随机数、循环、判断的经典逻辑。import random target = random.randint(1, 100) while True: guess = int(input("猜一个 1-100 的数字: ")) if guess > target: print("太大了") elif guess < target: print("太小了") else: print("猜对了!") break # 猜对后退出循环
4. 数据容器 (四大金刚)
AI 开发中 90% 的数据操作都围绕这四种结构。
| 类型 | 符号 | 可变性 | 有序性 | 重复性 | 典型 AI 场景 |
|---|---|---|---|---|---|
| List (列表) | [] |
✅ 可变 | ✅ 有序 | ✅ 允许 | 训练批次 (Batch)、结果收集 |
| Tuple (元组) | () |
❌ 不可变 | ✅ 有序 | ✅ 允许 | 模型超参数配置、坐标 (x,y) |
| Dict (字典) | {k:v} |
✅ 可变 | ✅ 有序(3.7+) | ❌ Key唯一 | JSON 数据、模型权重映射、Config |
| Set (集合) | {} |
✅ 可变 | ❌ 无序 | ❌ 自动去重 | 数据去重、词表构建、交集运算 |
4.1 List (列表) 深度操作
nums = [1, 2, 3, 4, 5]
# 1. 访问与切片 (Slicing) [start:end:step] -> 顾头不顾尾
print(nums[0]) # 1 (第一个)
print(nums[-1]) # 5 (倒数第一个)
print(nums[1:3]) # [2, 3] (索引 1 到 2)
print(nums[::-1]) # [5, 4, 3, 2, 1] (反转列表,常用技巧)
# 2. 增删改
nums.append(6) # 尾部添加
nums.insert(0, 0) # 指定位置插入 (索引 0 插入 0)
nums.remove(3) # 删除第一个匹配的元素 3
del nums[0] # 按索引删除
# 3. 其他常用
len(nums) # 长度
3 in nums # 判断是否存在 (返回 True/False)
nums.sort() # 原地排序 (从小到大)
nums.sort(reverse=True) # 降序排序
4.2 Dict (字典) 深度操作
model_config = {
"name": "Qwen",
"layers": 32,
"lr": 0.001
}
# 1. 访问 (推荐用 get,防止 key 不存在报错)
print(model_config["name"])
print(model_config.get("batch_size", 32)) # 若不存在,返回默认值 32
# 2. 修改/新增
model_config["lr"] = 0.0001 # 修改
model_config["batch_size"] = 64 # 新增
# 3. 删除
del model_config["layers"]
# 4. 遍历 (AI 中极常用)
for k, v in model_config.items():
print(f"Key: {k}, Value: {v}")
4.3 Set (集合) 运算
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b) # 并集 {1, 2, 3, 4, 5, 6}
print(a & b) # 交集 {3, 4}
print(a - b) # 差集 {1, 2} (在 a 中但不在 b 中)
5. 函数 (Function)
5.1 定义与调用
- 文档字符串:函数定义后的第一行字符串,作为函数的说明文档。
- Return:返回结果,若无 return 则默认返回
None。
def calculate_loss(predict, target):
"""
计算简单的 L1 损失值
:param predict: 预测值 (float)
:param target: 真实值 (float)
:return: 损失值 (float)
"""
loss = abs(predict - target)
return loss
result = calculate_loss(0.9, 1.0)
5.2 参数传递的高级用法
- 位置参数:按顺序传递。
- 关键字参数:
key=value,顺序无关,可读性强。 - 默认参数:定义时赋值,调用时可省略。
- 不定长参数 (AI 框架源码常见):
*args: 接收多余的位置参数,打包成元组 (Tuple)。**kwargs: 接收多余的关键字参数,打包成字典 (Dict)。
def train_model(epoch, lr=0.01, *args, **kwargs):
print(f"Epoch: {epoch}, LR: {lr}")
print(f"Extra args (Tuple): {args}")
print(f"Extra kwargs (Dict): {kwargs}")
# 调用
train_model(10, 0.001, "GPU", "FP16", device="cuda", batch=32)
# 输出:
# Epoch: 10, LR: 0.001
# Extra args (Tuple): ('GPU', 'FP16')
# Extra kwargs (Dict): {'device': 'cuda', 'batch': 32}
5.3 Lambda 表达式 (匿名函数)
- 适用于简单的一行逻辑,常用于
sort,filter,map或 AI 框架的回调中。 - 格式:
lambda 参数: 表达式(自动返回表达式结果)
# 常见场景:列表排序 (按字典中的某个字段)
data = [{"name": "A", "score": 80}, {"name": "B", "score": 90}, {"name": "C", "score": 75}]
# 使用 lambda 指定排序 key
data.sort(key=lambda x: x["score"], reverse=True)
# 结果: [{'name': 'B', 'score': 90}, {'name': 'A', 'score': 80}, ...]
6. 面向对象编程 (OOP)
AI 工程(PyTorch, LangChain)的核心范式。一切皆对象。
6.1 类的定义与实例化
- 类名:大驼峰命名 (如
MyModel)。 - self:代表实例对象本身,方法中的第一个参数必须是
self。 __init__:构造函数,实例化时自动调用,用于初始化属性。
class LLM_Model:
def __init__(self, name, params):
self.name = name # 实例属性
self.params = params
print(f"{self.name} 初始化完成")
def generate(self, prompt):
"""生成方法"""
return f"{self.name} 正在生成: {prompt}"
# 实例化
model = LLM_Model("Qwen-7B", "7B")
print(model.name) # 访问属性
print(model.generate("Hi")) # 调用方法
6.2 继承与重写 (Inheritance & Override)
- 继承:子类复用父类代码
class Child(Parent):。 - 重写:子类重新定义父类的方法,实现多态。
super():在子类中调用父类的方法(常用于扩展__init__)。
class BaseTrainer:
def train(self):
print("执行基础训练逻辑")
class CustomTrainer(BaseTrainer):
def __init__(self, lr):
super().__init__() # 调用父类初始化
self.lr = lr
def train(self):
print(f"自定义训练:学习率={self.lr}")
super().train() # 可选:保留并扩展父类逻辑
trainer = CustomTrainer(0.001)
trainer.train()
6.3 魔术方法 (Magic Methods)
以 __ 开头和结尾的方法,由系统自动触发,是 Python “黑魔法”的来源。
__init__: 初始化。__call__: 让实例对象可以像函数一样被调用obj()(PyTorch 的model(input)就是靠它)。__str__: 定义print(obj)时的输出格式。__len__: 定义len(obj)的行为。
class Adder:
def __init__(self, base):
self.base = base
def __call__(self, x):
"""使得 adder(5) 这种调用成为可能"""
return self.base + x
def __str__(self):
return f"Adder(base={self.base})"
add_5 = Adder(5)
print(add_5) # 输出: Adder(base=5) (触发 __str__)
print(add_5(10)) # 输出: 15 (触发 __call__)
7. 模块与包 (Module & Package)
- 模块 (Module):一个
.py文件就是一个模块。 - 包 (Package):包含
__init__.py的文件夹,用于组织多个模块。 - 导入方式:
import module_name-> 使用时module_name.func()from module_name import func-> 使用时func()from module_name import *-> 导入所有 (不推荐,易命名冲突)
# 导入随机模块
import random
num = random.randint(1, 10)
# 仅导入特定函数 (更简洁)
from math import sqrt
res = sqrt(16)
8. 异常处理 (Exception Handling)
防止程序因错误直接崩溃,对于长时间运行的 AI 训练任务尤为重要。
try:
# 可能出错的代码
result = 10 / 0
except ZeroDivisionError:
# 捕获特定错误
print("错误:除数不能为零")
except Exception as e:
# 捕获其他所有未知错误
print(f"发生未知错误: {e}")
finally:
# 无论是否出错都会执行 (常用于释放资源、关闭文件)
print("清理工作完成")
9. 文件操作 (File I/O) - 深度解析
在 AI 工程中,文件操作是数据加载、模型保存、日志记录的基础。
9.1 核心函数:open() 与 with 语句
- 标准写法:必须使用
with open(...) as f:。 - 优势:自动管理上下文,即使代码出错或中断,也能自动关闭文件,防止资源泄露(这在服务器长时间训练中至关重要)。
# 语法结构
with open("文件名", "模式", encoding="编码格式") as 变量名:
# 在这里进行读写操作
pass
9.2 模式参数详解 (mode)
不同的字母代表完全不同的操作权限,选错可能导致数据丢失!
| 模式 | 全称 | 中文含义 | 行为特征 | AI 开发场景 |
|---|---|---|---|---|
'r' |
Read | 只读 | 默认模式。文件必须存在,否则报错。指针在开头。 | 读取配置文件 (config.yaml)、加载预训练词表、读取测试集。 |
'w' |
Write | 写入 | 危险! 如果文件存在,直接清空所有内容再写入;如果不存在则创建。 | 覆盖旧的日志文件、导出最终预测结果、保存简化版的模型配置。 |
'a' |
Append | 追加 | 如果文件存在,指针移到末尾,新内容写在后面;不存在则创建。不会清空原内容。 | 训练日志 (Training Logs):每跑一个 epoch,把 Loss 追加到文件里,而不是覆盖昨天的记录。 |
'x' |
Create | 独占创建 | 仅当文件不存在时创建并写入;若存在则报错。 | 防止意外覆盖重要的实验结果文件(安全机制)。 |
'b' |
Binary | 二进制 | 通常与其他模式组合 (如 'rb', 'wb')。不按字符解码,按字节流处理。 |
加载模型权重 (.pth, .bin)、读取图片/音频原始数据。 |
'+' |
Update | 更新 | 组合模式 (如 'r+', 'w+'),允许同时读写。 |
较少直接使用,通常用于复杂的数据库文件或断点续传逻辑。 |
💡 关键区别记忆法:
w(Write) = Wipe (擦除):先擦干净黑板,再写字。(慎用!)a(Append) = Add (添加):直接在黑板最后接着写。(日志记录首选)
9.3 编码格式 (encoding)
- 问题:Windows 默认可能是
gbk,Linux/Mac 默认是utf-8。如果编码不匹配,读取中文时会报UnicodeDecodeError或出现乱码。 - 最佳实践:永远显式指定
encoding='utf-8'。这是国际通用标准,也是 HuggingFace 数据集的标准格式。
9.4 实战代码示例
场景 A:读取 JSON 格式的训练数据
import json
data_list = []
# 'r': 只读, 'utf-8': 防止中文乱码
with open("train_data.json", "r", encoding="utf-8") as f:
# json.load() 将文件内容直接转换为 Python 的 list 或 dict
data_list = json.load(f)
print(f"成功加载 {len(data_list)} 条训练数据")
场景 B:记录训练日志 (追加模式)
log_message = "Epoch 10, Loss: 0.023, Accuracy: 98.5%\n"
# 'a': 追加模式,确保之前的日志还在
# 'utf-8': 保证中文注释不乱码
with open("training_log.txt", "a", encoding="utf-8") as f:
f.write(log_message)
场景 C:二进制文件操作 (模拟保存模型)
# 模拟一些二进制数据 (实际中是 model.state_dict())
binary_data = b"\x00\x01\x02\x03"
# 'wb': 写入二进制 (Write Binary)
with open("model_checkpoint.bin", "wb") as f:
f.write(binary_data)
# 'rb': 读取二进制 (Read Binary)
with open("model_checkpoint.bin", "rb") as f:
loaded_data = f.read()
🌉 进阶篇:从 Python 基础到 AI 工程架构
掌握上述语法只是第一步。为了让你从“会写 Python”过渡到“能读懂 PyTorch/LangChain 源码”,我们需要理解这些基础概念在工业级 AI 框架中是如何被极致运用的。
1. List/Dict ➔ 张量 (Tensor) 与 数据管道
- 基础:列表存数据,字典存键值对。
- AI 深度应用:
- Tensor:AI 中的
List进化版。普通的 Python List 在百万级数据下速度极慢。AI 框架将其封装为 Tensor(多维数组),利用 GPU 并行加速。你需要理解list到torch.tensor的转换,以及向量化操作(避免 Python 原生循环)。 - JSON 即 Dict:大模型的输入输出(Prompt/Completion)本质上都是嵌套极深的
Dict。HuggingFace 的datasets库加载的数据,底层就是由无数个 Dict 组成的列式存储。 - Batch 处理:训练时,我们将多个样本(List of Dicts)打包成一个 Batch(Tensor),这是深度学习并行的核心。
- Tensor:AI 中的
2. Class/OOP ➔ 框架的骨架
- 基础:类是模板,对象是实例,继承是复用。
- AI 深度应用:
nn.Module(PyTorch 的核心):你在 PyTorch 中写的每一个模型,都必须继承torch.nn.Module类。__init__:定义网络层。forward:这是 OOP 中最特殊的方法。当你调用model(input)时,Python 会自动执行forward函数定义的前向传播逻辑。这是魔术方法__call__的典型应用。
- LangChain 的 Chain/Agent:LangChain 将复杂的 LLM 流程封装成类。理解 OOP 的多态性,你才能明白为什么不同的模型(GPT, Qwen, Llama)可以传入同一个
invoke()接口。 - DataLoader:自定义数据集时,你需要继承
Dataset类并重写__len__和__getitem__方法。
3. Lambda & Functional ➔ 数据变换 (Transforms)
- 基础:匿名函数,一行代码。
- AI 深度应用:
- Transforms 管道:在图像处理(TorchVision)或 NLP 预处理中,我们常定义一个变换列表。这些变换函数往往通过
lambda或高阶函数组合,形成一条数据流水线。 - Map/Reduce 思想:在处理海量数据时(如 Spark, Ray, HuggingFace Datasets),我们会用到
.map(function)。这里的function经常是一个简单的 lambda,用于清洗文本或提取特征。
- Transforms 管道:在图像处理(TorchVision)或 NLP 预处理中,我们常定义一个变换列表。这些变换函数往往通过
4. Try-Except ➔ 鲁棒性工程 (Robustness)
- 基础:捕获错误,防止程序崩溃。
- AI 深度应用:
- 分布式训练容错:在千卡集群上训练,硬件故障是常态。工程代码中充满了复杂的
try-except逻辑,用于自动重启节点、跳过损坏的数据块。 - API 重试机制:调用大模型 API 时,常遇到限流或超时。我们会结合
time.sleep和try-except实现指数退避重试策略,确保服务稳定。
- 分布式训练容错:在千卡集群上训练,硬件故障是常态。工程代码中充满了复杂的
5. 生成器 (Generator) - 补充关键知识点
- 基础:使用
yieldinstead ofreturn的函数。 - AI 深度应用:这是处理无限数据流的关键。
- 训练数据往往大到内存装不下(比如 1TB 的文本)。我们不能用
List一次性加载。 - 我们使用生成器,每次
yield一个 Batch 的数据。PyTorch 的DataLoader底层大量使用了生成器技术,实现“边读边训”,内存占用极低。
# AI 中的数据加载器原型 def data_generator(file_path): with open(file_path, 'r') as f: for line in f: yield process(line) # 每次只产出一条处理好的数据,不占内存 # 使用 for batch in data_generator("huge_dataset.txt"): train(batch) - 训练数据往往大到内存装不下(比如 1TB 的文本)。我们不能用
🚀 总结:你的学习路线图
- 第一阶段(现在):熟练掌握本手册中的基础语法,特别是文件操作的模式、类的定义和魔术方法。
- 第二阶段(入门 AI):学习
NumPy(矩阵运算) 和Pandas(数据处理),理解 Python 列表如何进化为张量。 - 第三阶段(框架实战):
- 阅读 PyTorch 源码,看他们如何利用
class和__call__构建模型。 - 阅读 HuggingFace
datasets源码,看他们如何利用generator和map处理大数据。
- 阅读 PyTorch 源码,看他们如何利用
- 第四阶段(工程化):学习如何使用
try-except构建高可用的推理服务,如何使用logging模块替代简单的print进行文件记录。
这份文档不仅是语法的集合,更是你通往 AI 工程师之路的第一块基石。保持好奇,多读源码,你会发现 Python 的每一个简单特性背后,都支撑着庞大的 AI 生态!
更多推荐



所有评论(0)