第三章 Python基础回顾:变量与数据类型、控制流、函数与文件操作

各位同学,欢迎来到第三章。这一章咱们要干一件很实在的事——把Python基础再过一遍。你可能会想:「Python基础?我早就会了。」嗯,我理解。但做仿真脚本开发,跟写普通脚本不太一样。有些坑,我当年踩过,今天帮你提前绕开。

说白了,这一章不是教你Python,而是教你「仿真脚本里怎么用Python」。咱们直奔主题。

3.1 变量与数据类型——别小看这步

变量这东西,谁不会?但我在项目中见过太多人因为变量类型搞错,仿真跑了一整夜,结果数据全废了。你想想看,多冤。

Python的变量是动态类型的,这既是好事也是坏事。好事是写起来快,坏事是——你一不小心就把字符串当数字算了。

核心数据类型速览

  • int / float:整数和浮点数。仿真里最常用,比如时间步长、电压值。
  • str:字符串。文件路径、日志信息、参数名,全是它。
  • list:列表。仿真结果序列、参数列表,用list存最方便。
  • dict:字典。配置参数、键值对数据,我几乎每个脚本都用。
  • tuple:元组。不可变,适合存固定参数,比如仿真起止时间。
  • bool:布尔值。控制流程开关,比如是否启用某个模块。
# 我习惯这样定义仿真参数
sim_start = 0.0          # float
sim_end = 100.0          # float
time_step = 0.01         # float
output_path = "./results/"  # str
parameters = {
    "temperature": 25.0,
    "voltage": 1.8,
    "frequency": 100e6
}  # dict

我的小习惯:变量名用全小写+下划线,别用驼峰。仿真脚本一长,驼峰看着眼睛疼。另外,常量用全大写,比如 MAX_ITER = 1000,一眼就知道不能改。

3.2 控制流——让脚本学会做决定

控制流就是让脚本「长脑子」。if判断条件,for/while循环干活。仿真脚本里,控制流用得特别多。

3.2.1 if/elif/else——条件判断

我曾经写过一个仿真脚本,跑了一整天,结果发现有个参数超出范围了,整个结果全废。从那以后,我每条数据进来都先做合法性检查。

temperature = float(input("请输入温度值: "))

if temperature < -40:
    print("温度过低,超出仿真范围")
elif temperature > 125:
    print("温度过高,超出仿真范围")
else:
    print(f"温度 {temperature}°C 在有效范围内,开始仿真")

注意:Python用缩进表示代码块,千万别混用空格和Tab。我建议统一用4个空格。编辑器里设置一下,一劳永逸。

3.2.2 for循环——遍历数据

for循环是仿真脚本的主力。遍历时间步、遍历参数组合、遍历文件列表,全用它。

# 遍历时间步
time_points = [0.0, 0.01, 0.02, 0.03, 0.04, 0.05]
for t in time_points:
    result = simulate(t)  # 假设simulate是仿真函数
    print(f"时间 {t}s: 结果 = {result}")

你想想看,如果手动写这些循环,得写到什么时候去?

3.2.3 while循环——条件循环

while循环适合不知道要循环多少次的情况。比如等待某个信号稳定。

# 等待信号稳定
signal_ready = False
while not signal_ready:
    signal_ready = check_signal()  # 检查信号状态
    time.sleep(0.1)  # 等100ms再查
print("信号已稳定,开始采集数据")

避坑指南:while循环一定要有退出条件,不然就死循环了。我曾经调试一个脚本,忘了加退出条件,结果跑了整整一个周末……嗯,不说了。

3.3 函数定义与调用——模块化的起点

函数是模块化的最小单元。我写仿真脚本,第一件事就是把重复代码抽成函数。为什么?因为改一处就行,不用到处找。

3.3.1 定义函数

def calculate_average(data_list):
    """计算列表的平均值"""
    total = sum(data_list)
    count = len(data_list)
    return total / count if count > 0 else 0

注意那个文档字符串(docstring),用三个双引号括起来。我建议每个函数都写,哪怕只有一行。为什么?因为三个月后你自己回来看,也记不清当初怎么想的了。

3.3.2 参数传递

Python的参数传递,说白了就是「传对象引用」。可变对象(如list)在函数内修改会影响外部,不可变对象(如int、str)不会。

def add_parameter(params, key, value):
    """向参数字典中添加一项"""
    params[key] = value  # 会修改外部字典

config = {"time": 100}
add_parameter(config, "step", 0.01)
print(config)  # 输出: {'time': 100, 'step': 0.01}

我的建议:函数尽量短,一个函数只做一件事。如果一个函数超过30行,就该拆分了。这是模块化的基本功。

3.4 文件读写操作——数据持久化

仿真脚本最终要跟文件打交道。读配置文件、写结果数据、保存日志,全是文件操作。

3.4.1 读文件

# 读取配置文件
with open("config.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())  # strip()去掉换行符

用 with open 是标准做法,它会自动关闭文件。我见过有人忘了关文件,导致数据没写进去,仿真白跑。

3.4.2 写文件

# 保存仿真结果
results = [0.1, 0.2, 0.15, 0.18, 0.22]
with open("results.txt", "w", encoding="utf-8") as f:
    for i, val in enumerate(results):
        f.write(f"第{i+1}次仿真: {val:.4f}\n")

注意模式:"w" 会覆盖原文件,"a" 是追加。我建议第一次写用 "w",后续追加用 "a"。别搞混了,不然数据丢了找不回来。

3.4.3 CSV文件——仿真数据的最爱

CSV格式简单,Excel能打开,Python也好处理。我几乎所有仿真结果都用CSV存。

import csv

# 写CSV
data = [
    ["时间", "温度", "电压"],
    [0.0, 25.0, 1.8],
    [0.01, 25.1, 1.79],
    [0.02, 25.2, 1.78]
]

with open("simulation_data.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerows(data)

小技巧:用 newline="" 避免CSV文件出现空行。这个坑我踩过,当时查了半天才发现是换行符的问题。

3.5 本章知识体系

下面这张图,是我梳理的本章知识结构。你可以把它当一张地图,学完一章回头看看,心里就有数了。

第三章 Python基础回顾 · 知识体系 Python基础回顾 变量与数据类型 控制流 函数定义与调用 文件读写操作 int/float str/list dict/tuple bool if/elif/else for循环 while循环 定义函数 参数传递 返回值 读文件 写文件 CSV操作

这张图把本章内容串起来了。你学完每个小节,回来看看它在图中的位置,就知道自己学到哪了。

好了,这一章就到这里。记住,基础不牢,地动山摇。把这些基础练扎实了,后面写仿真脚本才能得心应手。

可可精品资料库