Python 编程基础(上):环境配置、变量与数据类型、字符串与列表、元组与字典、条件判断与循环
各位同学,欢迎来到 Python 基础部分。说实话,Python 是我在机器人项目里用得最顺手的语言。它不像 C++ 那样处处要跟内存管理较劲,也不像 MATLAB 那样跑起来慢吞吞。Python 的哲学很简单——让代码读起来像英语,写起来像搭积木。
这一章我们先把 Python 的「地基」打牢。我会带着你从环境配置开始,一路走到条件判断和循环。别小看这些基础,我在调试机器人底盘时,80% 的 bug 都出在数据类型和逻辑判断上。
3.1 环境配置:别让工具卡住你
我见过太多同学在环境配置上浪费一整天。其实说白了,Python 环境就三样东西:解释器、包管理器、编辑器。
3.1.1 安装 Python 解释器
去官网 python.org 下载最新稳定版(目前是 3.12.x)。安装时记得勾选 「Add Python to PATH」——这个选项我每次都会强调,因为忘了勾的话,你后面在命令行敲 python 就会报错。
python --version 验证。如果看到版本号,说明环境通了。
3.1.2 包管理器 pip
Python 的强大在于第三方库。机器人开发常用的 numpy、opencv-python、pyserial 都得靠 pip 安装。
# 安装单个包
pip install numpy
# 安装指定版本
pip install opencv-python==4.8.0
# 批量安装(推荐用 requirements.txt)
pip install -r requirements.txt
pip install,结果跟 ROS 自带的 Python 包冲突,整个系统崩了。后来我学乖了——每个项目都用虚拟环境。
3.1.3 虚拟环境:隔离是美德
虚拟环境就像给每个项目一个独立的「小房间」。你在这个房间里装什么包,都不会影响到外面的系统。
# 创建虚拟环境
python -m venv robot_env
# 激活(Windows)
robot_env\Scripts\activate
# 激活(Mac/Linux)
source robot_env/bin/activate
# 退出
deactivate
我个人习惯把虚拟环境建在项目根目录下,取名 .venv。这样一眼就能看到,而且不会跟项目文件混在一起。
3.2 变量与数据类型:一切皆对象
Python 里变量不需要声明类型。你直接写 a = 10,Python 会自动推断 a 是整数。这很方便,但也容易让人忽略类型问题。
3.2.1 基本数据类型
| 类型 | 示例 | 说明 |
|---|---|---|
int |
42 |
整数,不限大小 |
float |
3.14159 |
浮点数,注意精度问题 |
bool |
True / False |
布尔值,首字母大写 |
str |
"hello" |
字符串,单双引号都行 |
None |
None |
空值,不是 0 也不是 False |
避坑指南:浮点数比较要小心。比如 0.1 + 0.2 == 0.3 结果是 False。为什么?因为计算机用二进制表示小数,有些十进制小数是无限循环的。我在做机器人里程计计算时,就因为这个 bug 导致定位偏差了 5 厘米。
3.2.2 动态类型与类型检查
Python 是动态类型语言,变量可以随时改变类型:
x = 10 # int
x = "hello" # 现在变成 str
x = [1, 2, 3] # 现在变成 list
这很灵活,但也会带来隐患。我建议在关键逻辑处用 isinstance() 做类型检查:
def process_speed(speed):
if not isinstance(speed, (int, float)):
raise TypeError("速度必须是数字")
# 处理逻辑...
3.3 字符串与列表:最常用的两种结构
字符串和列表,说白了就是「字符的序列」和「任意元素的序列」。它们有很多相似的操作,但本质不同。
3.3.1 字符串操作
字符串在机器人开发里主要用于日志输出、串口指令解析、配置文件读取。
# 字符串拼接
name = "机器人"
version = "v2.0"
log_msg = name + " 固件版本: " + version
# f-string(推荐,Python 3.6+)
log_msg = f"{name} 固件版本: {version}"
# 字符串切片
msg = "Hello Robot"
print(msg[0:5]) # "Hello"
print(msg[-5:]) # "Robot"
# 常用方法
msg.upper() # 转大写
msg.split(" ") # 按空格分割 -> ["Hello", "Robot"]
msg.replace("Robot", "Drone") # 替换
strip() 去掉首尾空白,再用 split() 分割。这样能避免很多因换行符导致的解析错误。
3.3.2 列表:万能容器
列表可以装任何类型,甚至可以混合装。但我不建议这么干——维护起来太痛苦了。
# 创建列表
sensors = ["激光雷达", "摄像头", "IMU"]
values = [1.2, 3.4, 5.6]
# 索引与切片(从0开始)
print(sensors[0]) # "激光雷达"
print(sensors[-1]) # "IMU"
print(sensors[1:]) # ["摄像头", "IMU"]
# 常用操作
sensors.append("超声波") # 末尾添加
sensors.insert(1, "编码器") # 指定位置插入
sensors.remove("摄像头") # 删除指定元素
popped = sensors.pop() # 弹出末尾元素
# 列表推导式(Python 特色)
squared = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]
copy() 或 [:]。
3.4 元组与字典:不可变与键值对
3.4.1 元组:不可变的列表
元组用圆括号,一旦创建就不能修改。这听起来像限制,但其实是保护。
# 创建元组
robot_config = ("192.168.1.100", 8080, "admin")
# 解包(超好用)
ip, port, user = robot_config
# 元组作为字典的键(列表不行)
locations = {
(0, 0): "起点",
(1, 0): "充电站",
(0, 1): "工作区"
}
我在项目中用元组来存储固定参数——比如电机 PID 系数、传感器校准值。这些值一旦设定就不该被意外修改,元组正好满足这个需求。
3.4.2 字典:快速查找的利器
字典是键值对的集合。在机器人开发里,我经常用它来存储传感器数据、配置参数、状态信息。
# 创建字典
robot_status = {
"battery": 85.5,
"speed": 0.3,
"mode": "自动导航",
"error_code": None
}
# 访问与修改
print(robot_status["battery"]) # 85.5
robot_status["speed"] = 0.5 # 修改
# 安全访问(推荐)
battery = robot_status.get("battery", 0) # 如果键不存在,返回默认值0
# 遍历
for key, value in robot_status.items():
print(f"{key}: {value}")
# 字典推导式
squared_dict = {x: x**2 for x in range(5)}
实战技巧:我在做多传感器融合时,用字典来管理不同传感器的数据。每个传感器一个键,值是一个包含时间戳、原始数据、滤波后数据的子字典。这样代码结构清晰,扩展也方便。
3.5 条件判断与循环:控制程序的流向
没有条件判断和循环,程序就是一条直线走到底。有了它们,程序才有了「智能」。
3.5.1 if-elif-else 结构
battery_level = 75
if battery_level > 80:
print("电量充足,继续工作")
elif battery_level > 30:
print("电量中等,注意监控")
elif battery_level > 10:
print("电量低,准备返回充电")
else:
print("紧急!电量耗尽,立即停止")
注意 Python 用缩进来表示代码块,不用花括号。我刚开始也不习惯,但用久了发现——缩进强制你写出整洁的代码。
3.5.2 for 循环:遍历一切
# 遍历列表
sensors = ["激光雷达", "摄像头", "IMU"]
for sensor in sensors:
print(f"正在初始化 {sensor}...")
# 遍历字典
robot_status = {"battery": 85, "speed": 0.3, "mode": "导航"}
for key, value in robot_status.items():
print(f"{key}: {value}")
# 使用 range()
for i in range(5): # 0, 1, 2, 3, 4
print(f"第 {i+1} 次尝试")
# enumerate() 同时获取索引和值
for idx, sensor in enumerate(sensors):
print(f"传感器 {idx}: {sensor}")
3.5.3 while 循环:条件驱动
while 循环适合你不知道要循环多少次的情况。比如等待传感器就绪:
import time
sensor_ready = False
retry_count = 0
max_retries = 5
while not sensor_ready and retry_count < max_retries:
print(f"等待传感器就绪... 第 {retry_count + 1} 次尝试")
# 模拟传感器初始化
time.sleep(1)
retry_count += 1
# 假设第3次成功
if retry_count >= 3:
sensor_ready = True
if sensor_ready:
print("传感器就绪,开始工作")
else:
print("传感器初始化失败,请检查硬件")
3.6 本章知识体系
下面这张图把本章的核心知识点串起来了。你可以把它当作一张「地图」,学完后再回来看,会更有感觉。
好了,这一章的内容就到这里。Python 基础就像盖房子的砖块——每一块都很简单,但组合起来就能造出复杂的系统。下一章我们会继续深入函数、模块和文件操作,这些都是写实际机器人程序绕不开的东西。
记得多动手敲代码。光看不练,等于白学。