Python 速成(面向 AI)
目标:2–4 天拿到「够用来做 AI」的 Python。
不需要学完 Python。做 AI 实际只用到其中一小部分:数据结构、函数、类、列表推导、少量内置库。Web 开发那套(Django、异步、装饰器元编程)这里一概不需要。
需要 vs 不需要
| 必须会 | 可以先跳过 |
|---|---|
| 变量、数字、字符串、布尔 | 多线程 / 多进程(L5 再看) |
| list / dict / tuple / set | 元类、描述符 |
if / for / while / 推导式 | 装饰器原理(会用 @ 即可) |
函数、默认参数、*args | 异步 async/await(L5 再看) |
类、__init__、继承(看得懂) | 类型注解的高级用法 |
模块导入、pip | 打包发布 |
| 读文件、异常处理 | 设计模式 |
1. 数据结构:90% 的代码在操作它们
python
# list:有序、可改
scores = [88, 92, 75]
scores.append(100)
print(scores[0], scores[-1], len(scores)) # 88 100 4
# dict:键值对,最常用
user = {"name": "李雷", "age": 28}
print(user["name"])
user["city"] = "上海"
print(user.get("phone", "未填写")) # 取不到给默认值,不报错
# tuple:不可变,常用于「一个样本 (x, y)」
point = (3, 4)
# set:去重、判断存在
tags = {"nlp", "cv", "nlp"}
print(tags) # {'nlp', 'cv'}AI 场景里 dict 出现频率最高:一条样本、一次 API 响应、一份配置,几乎都是 dict。
2. 控制流与推导式
python
# 基础判断与循环
for s in scores:
if s >= 90:
print(s, "优秀")
elif s >= 60:
print(s, "及格")
else:
print(s, "不及格")
# 列表推导式:数据预处理里天天用
scores = [88, 92, 75]
normalized = [s / 100 for s in scores] # 归一化
passed = [s for s in scores if s >= 60] # 过滤
squared = {s: s ** 2 for s in scores} # 字典推导
# 同时遍历下标和值
for i, s in enumerate(scores):
print(i, s)
# 并行遍历
names = ["a", "b", "c"]
for name, s in zip(names, scores):
print(name, s)3. 函数:把「一个处理步骤」封装起来
python
def normalize(values, method="minmax"):
"""把一列数归一化到 0-1。默认 min-max。"""
lo, hi = min(values), max(values)
if hi == lo: # 防御:全相同会导致除零
return [0.0 for _ in values]
return [(v - lo) / (hi - lo) for v in values]
print(normalize([10, 20, 30])) # [0.0, 0.5, 1.0]
print(normalize([1, 2], method="zscore")) # 占位:另一分支要点:
- 默认参数让函数有好用的「常见路径」
- 提前 return 处理边界情况,比层层缩进清晰
- 文档字符串(
"""...""")一句话说清「干什么、参数、返回」
4. 类:看懂就行,会写更好
PyTorch 里 Dataset、Module 都是类,你必须看得懂 class ... : 和 self。
python
class Sample:
def __init__(self, text, label):
self.text = text
self.label = label
def is_positive(self):
return self.label == 1
def __repr__(self): # print 对象时显示什么
return f"Sample({self.text!r}, label={self.label})"
s = Sample("这个产品很好用", 1)
print(s.is_positive(), s) # True Sample('这个产品很好用', label=1)三个必须记住的点:
__init__是构造函数,self指实例本身(必须写在第一个参数)self.xxx = ...才是「存在对象上」,不加self只是局部变量__repr__/__len__这类双下划线方法是 Python 的「协议」
5. 异常处理:真实数据一定有脏东西
python
raw = ["3.14", "abc", "", "2.71"]
values = []
for item in raw:
try:
values.append(float(item))
except ValueError:
print(f"跳过非法值: {item!r}")
print(values) # [3.14, 2.71]处理数据时不要用裸 except:,要写具体异常类型,否则会把真正的 bug 也吞掉。
6. 文件读写
python
import json
from pathlib import Path
# 文本
Path("notes.txt").write_text("hello", encoding="utf-8")
print(Path("notes.txt").read_text(encoding="utf-8"))
# JSON(配置、API 响应)
data = {"model": "resnet18", "lr": 0.001}
Path("config.json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.loads(Path("config.json").read_text(encoding="utf-8")))
# CSV 用 pandas 更省事,见 L1编码
中文一定要 encoding="utf-8",Windows 上默认可能是 GBK,会报 UnicodeDecodeError。
7. 模块与包
python
# 标准库
import os, math, random, json, time
from pathlib import Path
from collections import Counter
# 第三方
import numpy as np
import pandas as pd
import torch
# 自己写的文件
from utils import normalize # utils.py 里的函数bash
# 依赖管理:养成写 requirements.txt 的习惯
pip freeze > requirements.txt
pip install -r requirements.txt8. AI 里高频出现的 6 个语法糖
python
# ① 下标切片:切数据集
data = list(range(10))
print(data[:3], data[3:8], data[-2:])
# ② f-string:打日志(调试必备)
acc, loss = 0.93, 0.21
print(f"epoch=3 acc={acc:.3f} loss={loss:.4f}")
# ③ 解包
x, y = 1, 2
first, *rest = [1, 2, 3, 4]
# ④ 三元表达式
label = "正类" if 0.9 > 0.5 else "负类"
# ⑤ any / all(校验整批数据)
nums = [0.2, 0.5, 0.9]
print(all(0 <= n <= 1 for n in nums)) # True
# ⑥ with 上下文管理:开文件不用手动 close
with open("notes.txt", encoding="utf-8") as f:
content = f.read()练习(做完就算过关)
用纯 Python(不装任何库)完成:
- 给定一段文本,统计词频前 5(用
dict+sorted) - 实现
train_test_split(data, ratio=0.8, seed=42),用random.seed保证可复现 - 写一个
evaluate(preds, labels)函数返回准确率,处理「preds 与 labels 长度不一致」抛异常 - 读一个 JSON 文件,把其中所有
null值替换为0后写回