第2章:Python基础回顾

各位同学,咱们开始上课。这一章我打算带大家快速过一遍Python的基础知识。你可能会问:“老师,我学过Python,能不能跳过?”我的建议是——别急。我在自动化项目里见过太多人,因为基础不牢,写出来的脚本跑着跑着就崩了。咱们花点时间,把地基打扎实。

2.1 Python环境配置

做仪器仪表自动化,Python环境其实没那么复杂。我个人习惯用Anaconda,因为它把科学计算库都打包好了。你想想看,要是手动装numpy、scipy、pandas这些库,光解决依赖冲突就够你喝一壶的。

我的小建议: 装Python 3.8或3.9版本。别追最新版,有些仪器厂商的SDK还没适配Python 3.12。我在项目中吃过这个亏,折腾了两天才发现是版本不兼容。

安装步骤很简单:

  1. 去Anaconda官网下载安装包
  2. 一路默认安装,记得勾选“Add to PATH”
  3. 打开命令行,输入 python --version 验证

嗯,这里要注意。如果你用的是公司内网,可能没法直接下载。那就用Miniconda,轻量级,够用。或者直接装官方Python,然后手动装库。我建议你装个IDE,PyCharm或者VS Code都行。我个人偏爱VS Code,插件丰富,调试方便。

2.2 基本语法

Python的语法,说白了就是“用缩进代替大括号”。刚开始你可能不习惯,但用久了你会发现——真香。代码看起来干净多了。

变量与数据类型

Python是动态类型语言,变量不用声明类型。比如:

# 这是我常用的写法
temperature = 25.6    # 浮点数,温度值
pressure = 101.3      # 浮点数,压力值
is_online = True      # 布尔值,设备状态
device_name = "GC-2014"  # 字符串,设备型号

我在项目中遇到过一个问题:有人把字符串当数字用了,结果计算时报错。所以记住,类型转换要显式做:

value = "25.6"
real_value = float(value)  # 转成浮点数

条件判断与循环

控制流程这块,咱们做仪器控制时用得特别多。比如判断设备是否就绪:

if device_status == "ready":
    start_measurement()
elif device_status == "error":
    log_error()
else:
    wait_for_device()

循环呢?我经常用它来轮询设备状态:

# 轮询直到设备完成
while not device.is_idle():
    time.sleep(0.5)  # 等500毫秒再查
    print("设备工作中...")

你想想看,要是没有循环,你得写多少重复代码?

2.3 数据结构

这部分是重点。做自动化流程控制,数据结构的选型直接影响代码的效率和可读性。

列表(List)

列表就是一组有序的数据。我常用它来存测量结果:

# 存储一组温度数据
temperatures = [25.1, 25.3, 25.0, 25.2, 25.4]
# 添加新数据
temperatures.append(25.5)
# 访问第3个数据(索引从0开始)
print(temperatures[2])  # 输出 25.0
曾经踩过的坑: 列表索引越界。我写过一个脚本,循环读取100个数据点,结果第101次访问时报错。从那以后,我每次访问列表前都会检查长度:if len(data) > index:

字典(Dictionary)

字典是键值对,特别适合存设备参数。比如:

# 配置一台色谱仪的参数
gc_config = {
    "model": "GC-2014",
    "column_temp": 150,
    "injector_temp": 250,
    "detector_temp": 300,
    "flow_rate": 1.2
}
# 修改某个参数
gc_config["column_temp"] = 160
# 获取参数值
print(gc_config.get("column_temp", "未设置"))

我个人习惯用字典来管理多台设备的配置。你想想看,要是用列表存,你得记住每个位置对应什么参数,多累啊。

元组(Tuple)

元组和列表很像,但它是不可变的。我一般用它来存固定配置:

# 仪器支持的测量模式,不可修改
measurement_modes = ("single", "continuous", "timed")
# 访问
print(measurement_modes[1])  # 输出 "continuous"
为什么用元组? 因为不可变,所以更安全。比如你定义了一组校准参数,不希望被意外修改,用元组就对了。

2.4 函数与模块

写自动化脚本,最忌讳的就是“一坨代码”。我见过有人把几百行代码写在一个文件里,调试起来简直要命。函数和模块就是用来解决这个问题的。

函数

函数就是把一段逻辑封装起来,方便重复调用。比如:

def read_temperature(device_id, channel):
    """
    读取指定设备指定通道的温度值
    :param device_id: 设备ID
    :param channel: 通道号
    :return: 温度值(浮点数)
    """
    # 这里是读取硬件的代码
    value = 25.6  # 模拟读取
    return value

# 调用函数
temp = read_temperature("GC-2014", 1)
print(f"温度值: {temp}°C")

嗯,这里要注意。函数命名要清晰,别用a、b、c这种。我在项目中看到过def f1(x):这样的函数,三个月后连写代码的人自己都看不懂了。

模块

模块就是把相关的函数和变量放在一个.py文件里。比如,你可以创建一个instrument_utils.py

# instrument_utils.py
def connect_device(ip, port):
    print(f"连接到 {ip}:{port}")
    # 连接逻辑

def disconnect_device():
    print("断开连接")
    # 断开逻辑

def read_data():
    print("读取数据")
    # 读取逻辑

然后在主程序里导入:

import instrument_utils

instrument_utils.connect_device("192.168.1.100", 502)
data = instrument_utils.read_data()
instrument_utils.disconnect_device()

你想想看,这样代码多清晰。每个模块负责一块功能,出了问题也好定位。

核心要点:
  • 环境配置:推荐Anaconda + Python 3.8/3.9
  • 基本语法:缩进代替大括号,注意类型转换
  • 列表:有序可变,适合存序列数据
  • 字典:键值对,适合存配置参数
  • 元组:不可变,适合存固定数据
  • 函数:封装逻辑,提高复用性
  • 模块:组织代码,便于维护

好了,这一章就到这里。下一章咱们开始讲Python在仪器控制中的实际应用——串口通信。到时候我会带大家写一个真正的设备控制脚本。记得把今天的内容消化掉,基础不牢,后面会吃力。