4. 分支和循环:if判断语句、运算符、if-else语句、while循环、for循环、break、continue
各位工程师朋友,大家好。今天我们来聊聊脚本里最核心的控制结构——分支和循环。说白了,就是让代码学会「做选择」和「重复劳动」。这两样东西玩不转,你的脚本就只能是一条道走到黑,毫无灵活性可言。
我在仿真脚本里摸爬滚打这么多年,可以负责任地告诉你:90% 的自动化逻辑,都离不开分支和循环。你想想看,我们要处理不同工艺角下的波形数据,要遍历成千上万个仿真点,要判断结果是否收敛……这些场景,哪个能少了它们?
4.1 if判断语句:让代码学会做选择
if 语句,是分支结构的基础。它的逻辑很简单:如果条件成立,就执行某段代码。我习惯把它想象成一个「看门人」——条件满足,放行;不满足,抱歉,请回。
语法上,Python 的 if 语句非常直观:
if 条件:
执行语句块
注意那个冒号,还有缩进。这是 Python 的「身份证」,少了它,代码就不认了。我在项目中遇到过不少新手,写 if 语句时忘了冒号,或者缩进不一致,结果程序跑起来直接报错。嗯,这种错误其实很常见,但也很容易避免——养成好习惯就行。
举个仿真中的实际例子。假设我们要判断一个仿真结果是否在容差范围内:
measured_value = 1.05 # 仿真测量值
target_value = 1.0 # 目标值
tolerance = 0.1 # 容差
if abs(measured_value - target_value) <= tolerance:
print("仿真结果在容差范围内,通过!")
这里用到了 abs() 函数取绝对值,配合比较运算符 <=。条件成立,就打印通过信息。简单明了。
4.2 运算符:判断的「武器库」
光有 if 还不够,你得会用运算符来构建条件。Python 的运算符分几大类,我挑最常用的说说:
- 比较运算符:
==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于) - 逻辑运算符:
and(与)、or(或)、not(非) - 成员运算符:
in(在……中)、not in(不在……中)
我个人最常用的是逻辑运算符。比如在判断仿真是否通过时,往往需要多个条件同时满足:
voltage = 1.2
current = 0.05
temperature = 85
if voltage > 1.0 and current < 0.1 and temperature <= 100:
print("所有条件满足,仿真通过!")
你看,一个 and 就把三个条件串起来了。这就是逻辑运算符的威力——组合条件,精准判断。
4.3 if-else语句:两条路,选一条
if 只能处理「条件成立」的情况。那条件不成立呢?这时候就需要 if-else 了。它就像岔路口——要么走左边,要么走右边,没有中间选项。
if 条件:
执行语句块A
else:
执行语句块B
我曾经写过一个脚本,用来判断仿真是否超时。如果超时,就记录错误并重试;否则,继续下一步。用 if-else 实现起来非常清晰:
sim_time = 120 # 仿真耗时(秒)
timeout = 100 # 超时阈值
if sim_time > timeout:
print("仿真超时!记录日志并准备重试...")
# 这里可以写重试逻辑
else:
print("仿真正常完成,继续后续处理。")
# 这里可以写后续处理逻辑
如果条件不止两个,比如要分多个档次判断,可以用 if-elif-else 结构。elif 是 else if 的缩写,可以写多个:
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"
print(f"仿真评分等级:{grade}")
这里要注意顺序——条件从上往下依次判断,一旦命中,后面的就不看了。所以要把最严格的条件放在最前面。
4.4 while循环:重复,直到条件不满足
循环,就是让代码「重复做某件事」。while 循环是其中最基础的一种——只要条件为真,就一直执行。它的语法和 if 很像,但效果完全不同:
while 条件:
执行语句块
我刚开始学编程时,犯过一个经典错误——忘记在循环里更新条件,结果程序陷入了死循环。那次我写了一个等待仿真完成的脚本,忘了在循环里检查仿真状态,结果脚本一直跑,CPU 占用率飙到 100%,差点把服务器搞崩了。嗯,从那以后,我每次写 while 循环都会问自己一句:「这个循环能退出吗?」
来看一个正确的例子。假设我们要等待一个仿真进程结束,每隔 5 秒检查一次:
import time
sim_complete = False
check_count = 0
while not sim_complete:
# 检查仿真是否完成(这里用模拟逻辑)
# 实际项目中,可能是检查某个文件是否存在,或者读取某个状态寄存器
check_count += 1
print(f"第 {check_count} 次检查:仿真仍在运行...")
if check_count >= 10: # 最多检查10次
print("检查次数超限,强制退出循环。")
break
time.sleep(5) # 等待5秒
print("循环结束。")
这个例子中,while not sim_complete 是循环条件。循环体内,我们通过 check_count 来模拟条件的变化,并设置了最大检查次数来防止死循环。这是一种很实用的「安全网」设计。
4.5 for循环:遍历,一个不落
for 循环是另一种循环方式,它更适合遍历一个序列——比如列表、元组、字符串,或者用 range() 生成的数字序列。它的语法是:
for 变量 in 序列:
执行语句块
我个人非常喜欢 for 循环,因为它天然避免了死循环——你遍历的东西是有限的,遍历完了自然就结束。在仿真脚本中,我经常用它来批量处理仿真结果文件:
sim_files = ["sim1.txt", "sim2.txt", "sim3.txt", "sim4.txt"]
for file_name in sim_files:
print(f"正在处理文件:{file_name}")
# 这里可以写读取文件、分析数据的逻辑
# 比如:with open(file_name, 'r') as f: data = f.read()
print("所有文件处理完毕。")
如果你需要遍历一个数字范围,range() 函数是你的好帮手。它有三种常用形式:
range(n):生成 0 到 n-1 的整数序列range(start, stop):生成 start 到 stop-1 的整数序列range(start, stop, step):生成 start 到 stop-1,步长为 step 的整数序列
举个例子,假设我们要生成 10 个不同频率的仿真点:
for freq in range(100, 1100, 100): # 从100MHz到1000MHz,步长100MHz
print(f"正在运行频率为 {freq}MHz 的仿真...")
# 这里可以调用仿真命令
你看,range(100, 1100, 100) 会生成 100, 200, 300, ..., 1000 这 10 个频率点。配合 for 循环,一次搞定。
4.6 break和continue:循环的「刹车」和「跳过」
有时候,我们需要在循环中「提前退出」或者「跳过某一次」。这时候就要用到 break 和 continue 了。
- break: 立即终止整个循环,跳出循环体。就像踩了急刹车。
- continue: 跳过当前这一次循环,直接进入下一次。就像跳过一集电视剧。
我在仿真脚本中经常用 break 来实现「找到就停」的逻辑。比如,我们要在大量仿真结果中查找第一个满足条件的值:
results = [0.8, 0.9, 1.05, 1.1, 0.95, 1.02]
for value in results:
if value >= 1.0 and value <= 1.1:
print(f"找到目标值:{value}")
break # 找到了,立即退出循环
else:
print("未找到目标值。") # 注意:这个 else 属于 for 循环,当循环正常结束(没有被 break)时执行
而 continue 则常用于「过滤」场景。比如,我们只想处理那些有效的仿真数据,跳过无效的:
data_points = [1.2, -999, 1.3, 1.1, -999, 1.4] # -999 表示无效数据
for point in data_points:
if point == -999:
continue # 跳过无效数据
print(f"处理有效数据:{point}")
# 这里可以写数据处理逻辑
你看,continue 让代码跳过了那些无效的 -999,只处理了有效的数据点。干净利落。
知识体系总览
说了这么多,我们来画一张图,把今天的内容串起来。这张 SVG 图展示了分支和循环的核心结构,以及它们之间的关系:
这张图把今天的内容分成了四大块:分支结构、运算符、循环结构和循环控制。分支和循环是骨架,运算符是血肉,break 和 continue 是关节——它们组合在一起,才能让你的脚本灵活自如。
好了,今天的内容就到这里。分支和循环是脚本编写的「基本功」,看似简单,但用好了威力无穷。我建议你多写、多练,在实战中体会它们的妙处。记住,好的脚本不是写出来的,是改出来的——而分支和循环,就是你修改脚本时最趁手的工具。