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("检测到行人,触发警报")
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 # 别忘了更新计数器,否则会死循环
frame_count += 1,结果程序卡死了,只能强制关闭终端。
2.6 本章知识结构图
下面这张图把本章的核心知识点串起来了。你可以把它当成一张地图,学完后再回来看一眼,思路会更清晰。
2.7 避坑指南与实战建议
最后,我把自己这些年用 Python 做视觉项目时遇到的一些坑,整理成清单给你。遇到了别慌,回来翻翻就行。
- 缩进不一致:这是新手最常见的错误。我建议你统一用 4 个空格,别混用 Tab 和空格。大多数编辑器(如 VS Code)都可以设置。
- 列表索引越界:访问列表时,索引从 0 开始。如果列表有 3 个元素,索引范围是 0~2,访问
list[3]就会报错。我一般用len()先确认长度。 - 字典键不存在:直接访问不存在的键会报 KeyError。安全做法是用
dict.get(key, default_value)。 - 忘记更新循环变量:写 while 循环时,一定要确保循环条件会变化,否则就是死循环。