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 就把三个条件串起来了。这就是逻辑运算符的威力——组合条件,精准判断。

小技巧: 写条件时,尽量把「最可能不满足」的条件放在前面。这样 Python 可以「短路求值」,提前退出判断,提高效率。比如上面那个例子,如果 voltage 已经小于 1.0 了,后面的 current 和 temperature 根本不会去检查。

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 来模拟条件的变化,并设置了最大检查次数来防止死循环。这是一种很实用的「安全网」设计。

避坑指南: 写 while 循环时,一定要确保循环条件在某个时刻会变成 False。否则,你的程序就会「永远年轻,永远热泪盈眶」——永远跑下去。我曾经见过一个同事的脚本,因为 while 循环条件写错了,跑了整整一个周末才发现。那滋味,不好受。

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,只处理了有效的数据点。干净利落。

小技巧: for 循环后面可以跟一个 else 子句。这个 else 在循环正常结束(没有被 break 中断)时执行。这是一个很 Pythonic 的特性,可以用来实现「如果没有找到就……」的逻辑。上面那个 break 的例子就用了这个技巧。

知识体系总览

说了这么多,我们来画一张图,把今天的内容串起来。这张 SVG 图展示了分支和循环的核心结构,以及它们之间的关系:

分支和循环知识体系 分支结构 if 语句:单条件判断 if-else 语句:双分支选择 if-elif-else:多分支选择 运算符 比较运算符:== != > < >= <= 逻辑运算符:and or not 成员运算符:in not in 循环结构 while 循环:条件控制 for 循环:遍历序列 range():生成数字序列 循环控制 break:立即终止循环 continue:跳过当前迭代 for-else:循环正常结束执行

这张图把今天的内容分成了四大块:分支结构、运算符、循环结构和循环控制。分支和循环是骨架,运算符是血肉,break 和 continue 是关节——它们组合在一起,才能让你的脚本灵活自如。

好了,今天的内容就到这里。分支和循环是脚本编写的「基本功」,看似简单,但用好了威力无穷。我建议你多写、多练,在实战中体会它们的妙处。记住,好的脚本不是写出来的,是改出来的——而分支和循环,就是你修改脚本时最趁手的工具。

一句话总结: if 让代码会思考,while 和 for 让代码会干活,break 和 continue 让干活更灵活。把这四样东西玩熟了,你的脚本就能从「能用」变成「好用」。
可可精品资料库