变量、数据类型与运算
Python 存储和操作数据的基础。AI 中的每一个输入、权重、预测结果,都是某种数据类型的值。
变量:给数据贴标签
变量就是给数据起个名字,方便后续使用。可以把变量想象成一个盒子,你往盒子里放了某个值,之后用盒子的名字就能取出这个值。
变量赋值(Assignment)
用 = 符号将右边的值存入左边的变量名。注意: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_rate、batch_size。这叫 snake_case(蛇形命名法)。避免用 lr 这类缩写(除非在 AI 领域是公认约定,如 lr 表示 learning rate)。
基本数据类型
Python 有 4 种基本数据类型。type() 函数可以查看任何值的类型。
① int —— 整数
没有小数点的数字。在 AI 中常用于:样本数量、训练轮次(epoch)、批次大小(batch size)、层数等。
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。
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 响应等。大语言模型的输入输出全是字符串。
# 创建字符串
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 中用于:控制训练状态(是否训练中)、条件判断、模型输出的分类结果(是/否)。
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 数据处理中,经常需要在类型之间转换,比如把读取的字符串数字转为真正的数字类型。
# 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 + 3 | 8 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 5 * 3 | 15 |
/ | 除法(结果是 float) | 7 / 2 | 3.5 |
// | 整除(向下取整) | 7 // 2 | 3 |
% | 取余(模运算) | 7 % 2 | 1 |
** | 幂运算 | 2 ** 10 | 1024 |
# 计算模型准确率
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 中常用于初始化变量("还没有值")或函数没有返回值时的默认结果。
# 初始化(还没有模型)
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 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 真除是两个常见陷阱。