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
我曾经踩过的坑:在系统 Python 环境里直接 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 用缩进来表示代码块,不用花括号。我刚开始也不习惯,但用久了发现——缩进强制你写出整洁的代码。

我的习惯:条件判断里,把最可能发生的情况放在最前面。这样程序执行时能更快找到匹配分支,虽然 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("传感器初始化失败,请检查硬件")
我曾经犯过的错:写 while 循环忘了加退出条件,结果程序陷入死循环,机器人一直转圈直到撞墙。从那以后,我每个 while 循环都会确保有明确的退出条件,并且加上最大重试次数作为安。

3.6 本章知识体系

下面这张图把本章的核心知识点串起来了。你可以把它当作一张「地图」,学完后再回来看,会更有感觉。

Python 编程基础(上)知识体系 Python 编程基础(上)知识体系 Python 基础 环境配置 变量与数据类型 数据结构 控制流 解释器安装 pip 包管理 虚拟环境 int / float bool / None 动态类型检查 字符串 列表 元组 字典 if-elif-else for 循环 while 循环 学习路径建议 先搭环境 → 理解变量和类型 → 掌握字符串和列表 → 学会元组和字典 → 用条件判断和循环控制程序 每学完一个知识点,打开 Python 交互环境敲一遍代码,效果比只看不练好十倍

好了,这一章的内容就到这里。Python 基础就像盖房子的砖块——每一块都很简单,但组合起来就能造出复杂的系统。下一章我们会继续深入函数、模块和文件操作,这些都是写实际机器人程序绕不开的东西。

记得多动手敲代码。光看不练,等于白学。