2. Python 基础速通(上):变量与数据类型、列表、元组、字典、条件判断与循环

好,咱们正式开始动手写代码了。这一章我带你快速过一遍 Python 最核心的基础语法。别担心,我不会让你死记硬背。你想想看,后面我们要用 OpenCV 读图片、用 YOLO 做检测,本质上就是处理各种数据——数字、文字、坐标、颜色值。这些基础语法,就是操作这些数据的“手指”。

我个人习惯是,学语法一定要边敲边试。你打开 Jupyter Notebook 或者随便一个 Python 终端,跟着我下面的例子敲一遍,比看十遍书都管用。

2.1 变量与基本数据类型

变量,说白了就是给数据贴个标签。Python 里不需要提前声明类型,直接赋值就行。这一点我刚开始从 C++ 转过来时特别不习惯,但用久了真觉得爽。

# 这就是变量
image_path = "cat.jpg"      # 字符串
confidence = 0.95           # 浮点数
num_objects = 3             # 整数
is_detected = True          # 布尔值

Python 里常用的基本数据类型就这几种:

类型 英文名 例子 说明
整数 int 10, -3, 0 没有小数点的数
浮点数 float 3.14, 0.5, 1.0 带小数点的数
字符串 str "hello", 'a' 用引号括起来的文本
布尔值 bool True, False 只有两个值,注意大写
我的小习惯:给变量起名时,我一般用下划线分隔单词,比如 image_path、detection_result。别用拼音,也别用单个字母(循环变量 i 除外),不然项目大了你自己都看不懂。

2.2 列表与元组:有序的数据集合

做目标检测时,一张图里可能检测出好几个物体。这些物体的坐标、类别怎么存?列表就是干这个的。

列表(List)—— 灵活,可修改

# 一个检测框的坐标 [x1, y1, x2, y2]
bbox = [100, 150, 300, 400]

# 多个检测结果
detections = ["cat", "dog", "person"]

# 混合类型也没问题
mixed = [1, "hello", 3.14, True]

# 常用操作
detections.append("car")        # 添加元素
detections[0]                   # 访问第一个元素,结果是 "cat"
detections[-1]                  # 访问最后一个元素
len(detections)                 # 获取长度,结果是 4

元组(Tuple)—— 固定,不可修改

元组和列表很像,但一旦创建就不能改了。我一般在需要返回多个固定值,或者定义一些不会变的配置时用它。

# 图像尺寸 (宽, 高),创建后就不能改了
image_size = (640, 480)

# 访问方式和列表一样
width = image_size[0]   # 结果是 640

# 下面这行会报错,因为元组不可修改
# image_size[0] = 800
对比项 列表(List) 元组(Tuple)
语法 [] ()
是否可修改 可以增删改 创建后不能变
常用场景 动态数据,如检测结果列表 固定配置,如图像尺寸、颜色值
性能 稍慢 稍快,更安全
我曾经踩过的坑:有一次我把一个检测框的坐标存成了元组,后面想修改坐标值来微调位置,结果程序直接崩溃。后来我养成了习惯:凡是后续可能要改的数据,一律用列表;确定不变的,才用元组。

2.3 字典:键值对映射

字典是 Python 里我最喜欢的数据结构之一。它存的是“键-值”对,就像查字典一样,通过“键”找到对应的“值”。在 YOLO 检测中,我经常用它来存每个类别的颜色、或者每个检测物体的详细信息。

# 定义一个字典,存检测结果
detection = {
    "label": "cat",
    "confidence": 0.95,
    "bbox": [100, 150, 300, 400]
}

# 访问值
print(detection["label"])       # 输出: cat
print(detection["confidence"])  # 输出: 0.95

# 修改值
detection["confidence"] = 0.98

# 添加新的键值对
detection["color"] = (255, 0, 0)

# 遍历字典
for key, value in detection.items():
    print(f"{key}: {value}")

字典的键必须是不可变类型(字符串、数字、元组),值可以是任意类型。这一点要注意,我见过有人想用列表当键,结果报错了。

2.4 条件判断:让代码做决策

检测到物体后,我们经常要根据置信度做不同处理。比如置信度大于 0.5 才保留,否则丢弃。这就是条件判断的典型场景。

confidence = 0.85

if confidence > 0.9:
    print("高置信度,直接保留")
elif confidence > 0.5:
    print("中等置信度,需要进一步验证")
else:
    print("低置信度,丢弃")

Python 的条件判断有几个要点:

  • 冒号不能少:if、elif、else 后面都要加冒号
  • 缩进是关键:同一层的代码缩进必须一致,一般用 4 个空格
  • 逻辑运算符:and、or、not
# 实际项目中的组合条件
if confidence > 0.5 and label == "person":
    print("检测到行人,触发警报")
核心要点:条件判断的本质就是“如果...就...否则...”。你写代码时,先想清楚逻辑流程,再翻译成 if-elif-else,基本不会错。

2.5 循环:批量处理数据

检测一张图可能返回 10 个结果,你要挨个处理。这时候循环就派上用场了。Python 里最常用的是 for 循环。

for 循环 —— 遍历列表/字典

# 遍历检测结果列表
detections = ["cat", "dog", "person"]

for obj in detections:
    print(f"检测到: {obj}")

# 带索引的遍历
for i, obj in enumerate(detections):
    print(f"第{i+1}个物体: {obj}")

# 遍历字典
scores = {"cat": 0.95, "dog": 0.80, "person": 0.99}
for label, score in scores.items():
    print(f"{label}: {score}")

while 循环 —— 条件控制

while 循环用的相对少一些,但在处理视频流或实时检测时很常见。

# 模拟视频帧处理
frame_count = 0
while frame_count < 10:
    print(f"处理第 {frame_count+1} 帧")
    frame_count += 1  # 别忘了更新计数器,否则会死循环
注意:写 while 循环时一定要确保循环条件最终会变成 False,否则就是死循环。我刚开始学的时候,有一次忘了写 frame_count += 1,结果程序卡死了,只能强制关闭终端。

2.6 本章知识结构图

下面这张图把本章的核心知识点串起来了。你可以把它当成一张地图,学完后再回来看一眼,思路会更清晰。

Python 基础速通(上)知识结构 Python 基础语法 变量与数据类型 列表与元组 字典 条件判断与循环 int / float str / bool 列表 [] 元组 () 键值对映射 {} if / elif for / while 💡 核心:所有数据操作都围绕这四种结构展开,掌握它们就能处理 90% 的检测任务

2.7 避坑指南与实战建议

最后,我把自己这些年用 Python 做视觉项目时遇到的一些坑,整理成清单给你。遇到了别慌,回来翻翻就行。

  • 缩进不一致:这是新手最常见的错误。我建议你统一用 4 个空格,别混用 Tab 和空格。大多数编辑器(如 VS Code)都可以设置。
  • 列表索引越界:访问列表时,索引从 0 开始。如果列表有 3 个元素,索引范围是 0~2,访问 list[3] 就会报错。我一般用 len() 先确认长度。
  • 字典键不存在:直接访问不存在的键会报 KeyError。安全做法是用 dict.get(key, default_value)。
  • 忘记更新循环变量:写 while 循环时,一定要确保循环条件会变化,否则就是死循环。