2. Python基础回顾与工程化准备:Python虚拟环境搭建(venv/conda)、常用科学计算库安装(numpy, scipy, matplotlib)、代码规范与类型注解、Git版本控制入门

好,咱们正式开始。这一章说白了,就是给后续的仿真开发打好地基。

你可能觉得Python基础谁不会啊?但我在项目里见过太多人,代码写得飞起,结果换台电脑就跑不起来了。为什么?环境乱套了。所以这一章,咱们重点解决「工程化」的问题——让你的代码在任何地方都能稳定运行。

2.1 为什么需要虚拟环境?

想象一下,你同时做两个项目。一个用numpy 1.19,另一个用numpy 1.24。如果装在一个全局环境里,早晚会冲突。我当年刚入行时就吃过这个亏——一个仿真项目突然报错,查了半天,原来是另一个项目升级了scipy版本。

虚拟环境就是给每个项目一个独立的Python解释器和包空间。互不干扰,干净利落。

2.2 使用venv创建虚拟环境

Python自带的venv模块,轻量又好用。我个人习惯用这个,因为不需要额外装工具。

# 创建虚拟环境(在项目根目录下执行)
python -m venv sim_env

# 激活环境(Windows)
sim_env\Scripts\activate

# 激活环境(Mac/Linux)
source sim_env/bin/activate

# 退出环境
deactivate

激活后,终端前面会出现 (sim_env) 的提示。嗯,看到这个就说明你已经在虚拟环境里了。

小技巧: 我习惯把虚拟环境建在项目根目录下,命名为 venv 或 sim_env。这样一眼就能看出来。

2.3 使用conda管理环境

如果你做科学计算比较多,conda可能更适合你。它不仅能管理Python包,还能管理非Python的依赖库(比如C++编译的库)。

# 创建环境
conda create -n sim_env python=3.9

# 激活环境
conda activate sim_env

# 安装包
conda install numpy scipy matplotlib

# 退出环境
conda deactivate

# 删除环境
conda env remove -n sim_env

我个人觉得,如果只是做纯Python开发,venv就够了。但如果你要装一些底层库(比如OpenCV、PyTorch),conda会更省心。

2.4 常用科学计算库安装

咱们做自动驾驶仿真,这三个库是标配:

  • numpy:矩阵运算、数组操作。说白了,所有数据的基础容器。
  • scipy:科学计算工具箱。插值、优化、信号处理,后面都会用到。
  • matplotlib:数据可视化。画轨迹、画地图、画结果,全靠它。
# 一次性安装
pip install numpy scipy matplotlib

# 或者用conda
conda install numpy scipy matplotlib

安装完成后,可以验证一下:

import numpy as np
import scipy
import matplotlib.pyplot as plt

print(f"numpy版本: {np.__version__}")
print(f"scipy版本: {scipy.__version__}")
注意: 我曾经遇到过numpy版本不兼容的问题——新版本废弃了一些旧API。建议锁定版本号,比如 numpy==1.21.0,这样团队协作时不会出幺蛾子。

2.5 代码规范与类型注解

代码是写给人看的,顺便给机器执行。我见过太多「一次性代码」——写完自己都看不懂。所以从一开始,咱们就养成好习惯。

2.5.1 PEP 8 基本规范

  • 缩进用4个空格,不要用Tab
  • 每行不超过79个字符
  • 函数和类之间空两行
  • 变量命名用下划线分隔(snake_case)
  • 类名用驼峰命名(CamelCase)

2.5.2 类型注解

Python是动态语言,但加上类型注解后,代码的可读性和可维护性会大幅提升。说白了,就是告诉别人(也告诉自己)这个函数要什么参数、返回什么类型。

from typing import List, Tuple, Optional
import numpy as np

def calculate_path_length(
    waypoints: np.ndarray,
    start_idx: int = 0,
    end_idx: Optional[int] = None
) -> float:
    """
    计算路径总长度
    
    Args:
        waypoints: 路径点数组,形状为 (N, 2)
        start_idx: 起始点索引
        end_idx: 结束点索引,默认为最后一个点
    
    Returns:
        路径总长度
    """
    if end_idx is None:
        end_idx = waypoints.shape[0] - 1
    
    segment_lengths = np.diff(waypoints[start_idx:end_idx+1], axis=0)
    total_length = np.sum(np.linalg.norm(segment_lengths, axis=1))
    
    return float(total_length)

你看,加了类型注解和docstring,这个函数的作用一目了然。我在团队里推行这个习惯后,代码review的效率提高了不少。

核心原则: 类型注解不是强制性的,但建议对公共API和复杂函数都加上。它就像给代码穿了一件「防弹衣」。

2.6 Git版本控制入门

没有Git的代码项目,就像没有刹车的车——你敢开吗?

我刚开始做仿真时,代码改来改去,最后都不知道哪个版本能跑。直到学会了Git,才真正解放了生产力。

2.6.1 基本配置

# 设置用户名和邮箱(第一次使用)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# 查看配置
git config --list

2.6.2 常用命令

命令 作用 我常用的场景
git init 初始化仓库 新建项目时
git add . 添加所有改动到暂存区 写完一个功能模块后
git commit -m "消息" 提交改动 每次提交都写清楚改了啥
git status 查看当前状态 不确定改了哪些文件时
git log 查看提交历史 回溯问题时
git diff 查看具体改动 review代码时

2.6.3 实战流程

# 1. 初始化项目
cd my_sim_project
git init

# 2. 创建 .gitignore 文件(忽略虚拟环境等)
echo "sim_env/" >> .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore

# 3. 添加并提交
git add .
git commit -m "初始化项目:搭建虚拟环境与基础配置"

# 4. 后续开发
# 改完代码后
git add .
git commit -m "添加路径规划模块:实现A*算法"
避坑指南: 我曾经把虚拟环境(venv文件夹)也提交到了Git仓库,结果每次pull下来都要重新装包。后来加了.gitignore,世界清净了。

2.7 本章知识体系

下面这张图,帮你理清这一章的核心逻辑:

Python工程化准备 虚拟环境搭建 venv conda 科学计算库 numpy scipy matplotlib 代码规范 PEP 8 类型注解 Git版本控制 git init git add git commit .gitignore

这一章的内容,说白了就是四个字:打好地基。虚拟环境保证运行环境一致,科学计算库提供工具,代码规范让团队协作顺畅,Git让你敢改代码、能回溯。这些看似基础的东西,恰恰是后续所有仿真开发的前提。

嗯,准备好了吗?下一章咱们就开始动手写真正的仿真代码了。


可可精品资料库