CHAPTER 02

变量、数据类型与运算

Python 存储和操作数据的基础。AI 中的每一个输入、权重、预测结果,都是某种数据类型的值。

变量:给数据贴标签

变量就是给数据起个名字,方便后续使用。可以把变量想象成一个盒子,你往盒子里放了某个值,之后用盒子的名字就能取出这个值。

核心概念

变量赋值(Assignment)

= 符号将右边的值存入左边的变量名。注意:Python 的 = 不是"等于",而是"赋值"——把右边的值放进左边的盒子里。

PYTHON · 变量基础
# 变量赋值:把右边的值存入左边的变量
model_name = "GPT-4o"      # 字符串
learning_rate = 0.001      # 浮点数(AI 训练的关键参数)
batch_size = 32            # 整数
is_training = True         # 布尔值

# 可以把变量的值赋给另一个变量
lr = learning_rate          # lr 现在也是 0.001

# 变量可以重新赋值(值可以变)
learning_rate = 0.0001     # 现在变成 0.0001 了

# 同时赋值多个变量
x, y, z = 1, 2, 3

print(model_name)       # GPT-4o
print(learning_rate)    # 0.0001
print(x, y, z)          # 1 2 3
💡

命名规范:snake_case

Python 变量名习惯用小写字母加下划线,如 learning_ratebatch_size。这叫 snake_case(蛇形命名法)。避免用 lr 这类缩写(除非在 AI 领域是公认约定,如 lr 表示 learning rate)。

基本数据类型

Python 有 4 种基本数据类型。type() 函数可以查看任何值的类型。

① int —— 整数

没有小数点的数字。在 AI 中常用于:样本数量、训练轮次(epoch)、批次大小(batch size)、层数等。

PYTHON · int 整数
epochs = 100         # 训练 100 轮
num_samples = 50000  # 5 万个训练样本
layers = 12          # 神经网络 12 层

print(type(epochs))   # <class 'int'>
print(epochs ** 2)    # 10000(** 是幂运算)

# 整数支持任意大小(Python 的优势)
big_num = 10 ** 100   # 谷歌 = 10^100,Python 能算

② float —— 浮点数(小数)

带小数点的数字。在 AI 中最常用:学习率、损失值(loss)、准确率、模型权重等,几乎所有 AI 的计算结果都是 float。

PYTHON · float 浮点数
learning_rate = 0.001    # 学习率
loss = 2.345             # 损失值
accuracy = 0.9876       # 准确率 98.76%

# 科学计数法(AI 中常见的极小值)
weight = 1.5e-4          # 等于 0.00015
epsilon = 1e-8           # 极小值,防止除以零

print(type(loss))        # <class 'float'>
print(round(accuracy, 2)) # 0.99(保留2位小数)

# 注意浮点数精度问题(计算机通病)
print(0.1 + 0.2)          # 0.30000000000000004(不是精确的 0.3!)
⚠️

浮点数精度陷阱

计算机用二进制存储小数,某些十进制小数(如 0.1)无法精确表示,会有微小误差。在 AI 中通常不影响结果,但做精确比较时要用 abs(a - b) < 1e-9 而不是 a == b

③ str —— 字符串(文本)

文本类型,用单引号或双引号包裹。在 AI 中用于:提示词(Prompt)、模型名称、文本数据、API 响应等。大语言模型的输入输出全是字符串。

PYTHON · str 字符串
# 创建字符串
prompt = "请用中文回答以下问题"
model = 'claude-sonnet-4-6'  # 单双引号都行

# 多行字符串(用三引号)
system_prompt = """
你是一个专业的 AI 助手。
请用简洁清晰的语言回答问题。
"""

# f-string:最常用的字符串格式化方式
user_input = "什么是机器学习"
full_prompt = f"用户问题:{user_input}\n请简单回答:"

# 字符串拼接
text = "Hello" + " " + "World"   # Hello World

# 字符串长度
print(len(prompt))       # 10(字符数)

# 字符串方法
print(prompt.upper())    # 全大写(英文)
print(model.split('-'))  # ['claude', 'sonnet', '4', '6']
print("hello".replace("hello", "hi"))  # hi

# 检查子串是否存在
print("claude" in model)   # True

④ bool —— 布尔值(真/假)

只有两个值:True(真)和 False(假)。在 AI 中用于:控制训练状态(是否训练中)、条件判断、模型输出的分类结果(是/否)。

PYTHON · bool 布尔值
is_training = True
use_gpu = False
early_stop = True

# 比较运算返回布尔值
print(5 > 3)           # True
print(0.001 == 0.01)  # False
print(10 != 20)         # True(不等于)

# 逻辑运算
print(True and False)  # False(两个都要 True)
print(True or False)   # True(一个 True 就行)
print(not True)         # False(取反)

# 在 AI 中:检查是否使用 GPU 训练
import torch
gpu_available = torch.cuda.is_available()  # True 或 False
print(f"GPU 可用:{gpu_available}")

类型转换

在 AI 数据处理中,经常需要在类型之间转换,比如把读取的字符串数字转为真正的数字类型。

PYTHON · 类型转换
# int() - 转为整数
print(int("42"))      # 42(字符串 → 整数)
print(int(3.9))      # 3(浮点数 → 整数,直接截断,不四舍五入)
print(int(True))     # 1(True = 1,False = 0)

# float() - 转为浮点数
print(float("3.14")) # 3.14
print(float(5))      # 5.0

# str() - 转为字符串
print(str(100))      # "100"
print(str(0.001))    # "0.001"

# bool() - 转为布尔值
# 规则:0、空字符串""、None 是 False,其他是 True
print(bool(0))       # False
print(bool(1))       # True
print(bool(""))      # False(空字符串)
print(bool("hello")) # True

# 实际应用:读取 CSV 文件时,数字可能被读成字符串
raw_value = "0.95"              # 从文件读出来的是字符串
accuracy = float(raw_value)     # 必须转为 float 才能计算
print(accuracy * 100, "%")      # 95.0 %

运算符

数学运算符

运算符含义示例结果
+加法5 + 38
-减法5 - 32
*乘法5 * 315
/除法(结果是 float)7 / 23.5
//整除(向下取整)7 // 23
%取余(模运算)7 % 21
**幂运算2 ** 101024
PYTHON · AI 场景中的运算
# 计算模型准确率
correct = 892
total = 1000
accuracy = correct / total  # 0.892

# 梯度下降:更新参数
weight = 0.5
gradient = 0.1
lr = 0.01
weight = weight - lr * gradient  # 0.499

# 计算 step 数:1000个样本,batch_size=32
n_samples = 1000
batch_size = 32
steps_per_epoch = n_samples // batch_size   # 31 步(整除)
remainder = n_samples % batch_size          # 8 个剩余样本

# 模运算常见用途:每隔 N 步打印日志
for step in range(100):
    if step % 10 == 0:  # 每 10 步
        print(f"Step {step}")

# 复合赋值(常用简写)
loss = 2.0
loss -= 0.1   # 等于 loss = loss - 0.1 → 1.9
loss *= 0.9   # 等于 loss = loss * 0.9 → 1.71
🤖

AI 中最常用的运算

在 AI 训练中,你会反复看到 weight = weight - lr * gradient(梯度下降更新参数)和 loss / n_samples(计算平均损失)。这两个操作是神经网络学习的核心,背后就是这些基本运算。

None —— 空值

None 是 Python 中表示"什么都没有"的特殊值,相当于其他语言的 null。在 AI 中常用于初始化变量("还没有值")或函数没有返回值时的默认结果。

PYTHON · None 的使用
# 初始化(还没有模型)
model = None
best_loss = None

# 检查是否为 None
if model is None:
    print("模型还未加载")

# 函数没有 return 时默认返回 None
def train_one_step():
    print("训练中...")
    # 没有 return

result = train_one_step()  # 训练中...
print(result)               # None

Python 类型系统原理

Python 是动态类型 + 强类型语言,这两个概念经常被混淆,理解它们的区别至关重要。

  • 动态类型(Dynamic Typing) 变量的类型在运行时确定,不需要提前声明。同一个变量名可以先存整数后存字符串。Python 是动态类型语言。
  • 强类型(Strong Typing) 即使是动态类型,也不允许不相关类型之间隐式转换。"1" + 1 在 Python 中会报 TypeError,而不是自动变成 "11"2。这是 Python 与 JavaScript 的重要区别。
  • 类型提示(Type Hints,PEP 484) Python 3.5+ 支持可选的类型注解语法(def f(x: int) -> str),不影响运行时行为,但供 IDE、mypy 等工具做静态分析。在 AI 项目中用类型提示能大大减少 bug。
  • 鸭子类型(Duck Typing) "如果它走路像鸭子,叫声像鸭子,那它就是鸭子。" Python 不检查对象的具体类型,只检查它是否有所需的方法/属性。NumPy 数组和 Python 列表都可以用 for 遍历,因为都是可迭代对象。
PYTHON · 类型提示实战
# Python 3.9+ 类型提示(AI 项目推荐做法)
from typing import Optional

# 函数参数和返回值的类型提示
def compute_loss(
    predictions: list[float],   # 预测值列表
    labels: list[int],           # 真实标签列表
    reduction: str = "mean"      # 默认求均值
) -> float:
    """计算均方误差损失"""
    errors = [(p - l) ** 2 for p, l in zip(predictions, labels)]
    if reduction == "mean":
        return sum(errors) / len(errors)
    return sum(errors)

# Optional[T] 表示"T 或 None"
def load_checkpoint(path: Optional[str] = None) -> dict | None:
    """加载模型检查点,path 为 None 时返回 None"""
    if path is None:
        return None
    # 实际加载逻辑...
    return {"epoch": 0, "weights": []}

# Python 3.12+ 新类型别名语法(PEP 695)
type Batch[T] = list[T]          # 泛型批次类型
type LossTensor = list[float]    # 命名类型别名

# 类型提示不影响运行,只是给工具用
x: int = "hello"  # mypy 会报错,但 Python 仍然正常运行
⚠️

常见误区:动态类型 ≠ 弱类型

很多初学者以为 Python 类型随便混用。实际上 "hello" + 1 在 Python 中是 TypeError。动态类型只是说变量的类型不需要提前声明,不是说可以对任何类型做任何运算。在 AI 数据处理中,经常遇到数字被 Pandas 读为字符串类型(dtype object),必须显式转换才能计算。

⚠️

整数除法陷阱

Python 3 中 7 / 2 = 3.5(结果是 float),但 7 // 2 = 3(整除)。Python 2 的 7 / 2 = 3(整除)这个行为在 Python 3 被修改了。在 AI 中计算准确率时 correct / total 会自动是 float,不需要额外转换。

💡

本章小结

Python 有 4 种基本类型:int(整数)、float(浮点数)、str(字符串)、bool(布尔值),以及特殊值 None。Python 是动态类型+强类型语言,即变量类型在运行时确定,但不允许不兼容类型之间的隐式转换。类型提示(x: int)是 Python 3.5+ 的推荐写法,能帮助 IDE 发现错误。AI 开发中浮点精度问题和整除 vs 真除是两个常见陷阱。