Skip to content

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)

三个必须记住的点:

  1. __init__ 是构造函数,self 指实例本身(必须写在第一个参数)
  2. self.xxx = ... 才是「存在对象上」,不加 self 只是局部变量
  3. __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.txt

8. 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(不装任何库)完成:

  1. 给定一段文本,统计词频前 5(用 dict + sorted)
  2. 实现 train_test_split(data, ratio=0.8, seed=42),用 random.seed 保证可复现
  3. 写一个 evaluate(preds, labels) 函数返回准确率,处理「preds 与 labels 长度不一致」抛异常
  4. 读一个 JSON 文件,把其中所有 null 值替换为 0 后写回

通过标准 ​

下一步 ​

→ 第一个模型:30 分钟跑通全流程

AI 学习路线 · 从入门到专家