4. 分支和循环:控制代码的执行流向
写代码说白了就是指挥计算机干活。但计算机不是傻子,它得听你的指令一步步来。可如果所有指令都排着队一条条执行,那程序就太死板了。这时候就需要分支和循环——让代码学会「判断」和「重复」。
我个人习惯把分支和循环比作交通信号灯和高速公路。分支是红绿灯,决定走哪条路;循环是绕圈跑,直到跑够圈数才停。今天咱们就把这两个核心概念掰开揉碎,从源码层面看看它们到底怎么影响打印速度和精度。
4.1 if 判断语句:代码的十字路口
if 语句是编程里最基础的判断工具。它的逻辑很简单:如果条件成立,就执行某段代码;否则跳过。我在项目中遇到过不少新手把 if 写成死胡同——条件永远为假,代码根本跑不进去。
# 基础 if 结构
temperature = 38
if temperature > 37:
print("体温偏高,建议复测") # 条件为 True 时执行
你想想看,if 后面的条件其实就是一个布尔表达式。Python 会把任何非零、非空的值当作 True,把 0、None、空字符串当作 False。嗯,这里要注意:千万别把赋值号 = 和比较符 == 搞混了,我见过有人因为这个 bug 调试了一下午。
4.2 运算符:判断的基石
运算符是构成判断条件的砖瓦。没有运算符,if 语句就是个空壳。我把常用的运算符分成三类:比较运算符、逻辑运算符、成员运算符。
| 类型 | 运算符 | 说明 | 示例 |
|---|---|---|---|
| 比较 | ==, !=, >, <, >=, <= | 比较两个值 | age >= 18 |
| 逻辑 | and, or, not | 组合多个条件 | age > 18 and has_id |
| 成员 | in, not in | 检查是否在容器中 | "error" in log |
我曾经在优化打印日志时发现,用 in 运算符检查字符串比用 find() 方法快 30% 左右。说白了,Python 底层对 in 做了专门的优化,能直接走快速匹配路径。
if (age > 18) and (has_ticket or is_vip),这样可读性高,也避免运算符优先级搞出幺蛾子。
4.3 if-else 语句:两条路选一条
if-else 比单纯的 if 多了一个「否则」分支。程序要么走 if 的路,要么走 else 的路,没有第三种可能。这在处理二值逻辑时特别有用——比如判断打印任务是否成功。
# if-else 实战:判断打印状态
print_status = "completed"
if print_status == "completed":
print("打印完成,可以取件")
else:
print("打印失败,请检查耗材")
我记得有一次优化打印机的状态反馈,发现 if-else 的嵌套层数太多,代码读起来像迷宫。后来改用 elif 链式结构,清晰多了。但要注意:elif 本质上还是多个 if-else 的语法糖,性能上没有差别。
4.4 while 循环:重复直到条件不成立
while 循环就像个固执的守卫——只要条件为 True,它就一遍遍执行循环体。我在写打印队列的轮询逻辑时经常用 while,因为不知道要等多久,只能一直检查状态。
# while 循环:等待打印完成
import time
status = "printing"
while status == "printing":
print("正在打印,请稍候...")
time.sleep(1) # 模拟检查间隔
status = check_printer_status() # 假设这个函数返回状态
你想想看,while 循环最怕什么?死循环!如果条件永远为 True,程序就卡死了。我曾经在调试时忘了更新循环变量,结果控制台刷了几万行日志,差点把硬盘撑爆。所以写 while 循环时,一定要确保循环体里有改变条件的语句。
time.sleep(0) 想提高响应速度,结果 CPU 占用飙到 100%。后来改成 time.sleep(0.01),既保证了响应,又让 CPU 喘了口气。
4.5 for 循环:遍历一切可迭代对象
for 循环是 Python 里最优雅的循环方式。它不需要你手动管理索引,直接遍历列表、字符串、字典等任何可迭代对象。说白了,for 循环就是「挨个处理」的代名词。
# for 循环遍历打印任务列表
tasks = ["文档1.pdf", "图片2.png", "表格3.xlsx"]
for task in tasks:
print(f"正在打印:{task}")
# 实际打印代码...
我个人习惯用 for 循环替代 while 循环,除非真的需要无限循环。为什么?因为 for 循环自动处理了迭代终止条件,不容易写出死循环。而且 Python 的 for 循环底层用了迭代器协议,性能上比手动索引快不少。
for _ in range(n)。下划线 _ 是 Python 的惯例,表示「这个变量我不关心」。这样既省内存,又让代码意图更清晰。
4.6 break 和 continue:循环的刹车与跳过
break 和 continue 是循环里的两个特殊指令。break 是急刹车——立即跳出整个循环;continue 是跳过当前轮——直接进入下一轮迭代。我在处理打印队列时经常用它们来控制流程。
# break 和 continue 实战
tasks = ["正常文档", "损坏文件", "正常图片", "病毒文件"]
for task in tasks:
if task == "损坏文件":
print(f"跳过:{task}")
continue # 跳过当前,继续下一个
if task == "病毒文件":
print("发现病毒,终止所有打印!")
break # 立即停止整个循环
print(f"打印:{task}")
嗯,这里要注意:break 只跳出当前这一层循环。如果你有嵌套循环,break 只能跳出最内层。我曾经在多层循环里用 break 想一口气全退出,结果外层还在跑,数据全乱套了。后来改用 return 或者设置标志位才搞定。
- break:彻底结束循环,不再执行后续任何迭代
- continue:跳过本次迭代的剩余代码,直接进入下一次
- 两者通常配合 if 判断使用,形成「条件性中断」
最后说一句:分支和循环是编程的骨架。你写的每一行代码,最终都会被翻译成 CPU 能理解的跳转指令。理解它们的底层逻辑,你就能写出更高效、更稳定的代码。下次咱们聊聊函数和模块——怎么把代码组织得井井有条。