第四章:流程控制核心——让代码学会“思考”和“循环”
各位同学,欢迎来到第四章。前面我们学了变量、数据类型、运算符,说白了,代码已经能“算”了。但光会算还不够,你得让代码学会做决定、反复干活、甚至处理意外情况。这就是流程控制要做的事。
我个人习惯把流程控制比作代码的“大脑”。没有它,代码就是一条直线走到黑。有了它,代码才有了灵魂。今天我们就来彻底搞懂这四大块:条件判断、循环结构、循环控制、异常处理。
4.1 条件判断:if / elif / else
条件判断,说白了就是“如果...就...否则...”。这是代码做决策的基础。
4.1.1 基本语法
if 条件:
执行代码块
elif 其他条件:
执行代码块
else:
执行代码块
注意看,Python 用缩进来表示代码块。这一点跟很多语言不一样。我刚开始学的时候,老是因为缩进不对报错,气得想砸键盘。后来习惯了,反而觉得这样代码更干净。
核心要点:
- 条件后面必须加冒号
: - 缩进必须统一(建议用4个空格)
elif和else都是可选的
4.1.2 实际案例
假设你在写一个 RPA 脚本,需要根据网页返回的状态码做不同处理。代码可以这样写:
status_code = 200
if status_code == 200:
print("页面正常,开始抓取数据")
elif status_code == 404:
print("页面不存在,跳过")
elif status_code == 500:
print("服务器错误,等待重试")
else:
print(f"未知状态码:{status_code},记录日志")
我在项目中遇到过一个问题:多个条件判断时,顺序很重要。比如你写了个判断成绩等级的代码,先判断 score >= 60 再判断 score >= 90,那 95 分的人永远拿不到“优秀”。因为第一个条件就满足了。你想想看,这种逻辑错误很难排查。
我的建议:写条件判断时,把最严格的条件放在最前面。比如先判断 90 分以上,再判断 60 分以上。这样逻辑才清晰。
4.2 循环结构:for 和 while
循环,就是让代码反复执行某段操作。RPA 里最常见的场景就是:遍历 Excel 的每一行、处理列表里的每个元素、或者一直等待某个元素出现。
4.2.1 for 循环——遍历利器
for 循环适合遍历已知的数据集合。比如列表、元组、字典、字符串等。
# 遍历列表
files = ["report.xlsx", "data.csv", "config.json"]
for file in files:
print(f"正在处理:{file}")
# 遍历字典
user_info = {"name": "张三", "age": 30, "city": "北京"}
for key, value in user_info.items():
print(f"{key}:{value}")
# 配合 range() 使用
for i in range(5):
print(f"第 {i+1} 次循环")
嗯,这里要注意:range(5) 生成的是 0 到 4,不是 0 到 5。很多新手在这里翻车。我刚开始也犯过这个错,循环少了一次,数据漏了一行。
4.2.2 while 循环——条件驱动
while 循环适合你不知道要循环多少次,只知道什么时候停止的场景。
count = 0
while count < 5:
print(f"当前计数:{count}")
count += 1
为什么说 while 循环危险?因为如果条件永远为真,它就变成死循环了。我曾经写过一个 RPA 脚本,忘记在循环里更新计数器,结果脚本跑了一整夜,把服务器 CPU 跑满了。第二天被运维大哥骂了一顿。
避坑指南:写 while 循环时,一定要确保循环条件最终会变成 False。要么更新变量,要么用 break 跳出。否则你的代码会“永远年轻,永远热泪盈眶”。
4.3 循环控制:break 和 continue
这两个关键字,是循环里的“刹车”和“跳过”按钮。
| 关键字 | 作用 | 类比 |
|---|---|---|
| break | 立即终止整个循环 | 跑步时听到“停”,立刻停下 |
| continue | 跳过本次循环,进入下一次 | 跑步时遇到水坑,绕过去继续跑 |
4.3.1 break 示例
# 找到第一个偶数就停止
numbers = [1, 3, 5, 8, 9, 10]
for num in numbers:
if num % 2 == 0:
print(f"找到偶数:{num}")
break
这个场景在 RPA 里很常见。比如你批量处理文件,遇到第一个错误就停下来,避免浪费更多时间。
4.3.2 continue 示例
# 跳过所有奇数,只处理偶数
for i in range(10):
if i % 2 != 0:
continue
print(f"处理偶数:{i}")
我个人习惯用 continue 来过滤数据。比如处理 Excel 时,跳过空行或者无效数据。这样代码比嵌套 if 要清晰得多。
小技巧:break 和 continue 通常配合 if 使用。但别滥用,嵌套太深会让代码变成“意大利面条”。如果逻辑复杂,考虑拆成函数。
4.4 异常处理:try / except
代码跑起来,总会遇到意外。文件打不开、网络断了、数据格式不对...这些在 RPA 里太常见了。异常处理就是给你的代码穿上“防弹衣”。
4.4.1 基本结构
try:
# 可能出错的代码
result = 10 / 0
except ZeroDivisionError:
# 捕获特定异常
print("除数不能为零")
except Exception as e:
# 捕获所有其他异常
print(f"发生未知错误:{e}")
else:
# 没有异常时执行
print("一切正常")
finally:
# 不管有没有异常都执行
print("清理资源")
你看,try 块里放可能出错的代码,except 块里放处理方案。else 和 finally 是可选的,但 finally 特别有用——比如关闭文件、释放连接,这些操作必须执行。
4.4.2 实战案例
假设你在写一个 RPA 脚本,需要读取一个可能不存在的文件:
try:
with open("data.txt", "r") as f:
content = f.read()
print(content)
except FileNotFoundError:
print("文件没找到,创建默认文件")
with open("data.txt", "w") as f:
f.write("默认内容")
except PermissionError:
print("没有权限读取文件,请检查权限")
except Exception as e:
print(f"其他错误:{e}")
# 记录日志,方便排查
log_error(e)
我在项目中遇到过一个问题:只用了 except: 没有指定异常类型。结果所有错误都被吞掉了,连代码写错了都发现不了。调试了整整一下午才发现是变量名拼错了。
避坑指南:永远不要写空的 except: 或者 except Exception: 然后什么都不做。至少打印个日志。否则错误被静默处理,你根本不知道代码出了什么问题。
4.4.3 异常处理的层级
异常可以嵌套。内层没捕获的异常,会往外层抛。你可以利用这个特性,在顶层统一处理:
def process_data():
try:
# 具体处理逻辑
pass
except ValueError:
print("数据格式错误")
raise # 重新抛出,让上层处理
def main():
try:
process_data()
except Exception as e:
print(f"主程序捕获到错误:{e}")
# 发送告警邮件
嗯,这里要注意:raise 关键字可以把异常继续往上抛。这在分层架构里很常用——底层只处理自己能处理的,处理不了的交给上层。
4.5 综合实战:一个完整的 RPA 流程
最后,我们把这些知识点串起来。假设你要写一个 RPA 脚本,批量处理 Excel 文件:
import os
files = ["data1.xlsx", "data2.xlsx", "data3.xlsx"]
for file in files:
try:
print(f"开始处理:{file}")
# 检查文件是否存在
if not os.path.exists(file):
print(f"文件 {file} 不存在,跳过")
continue
# 模拟处理逻辑
# 这里假设处理成功
print(f"处理完成:{file}")
except PermissionError:
print(f"文件 {file} 被占用,跳过")
continue
except Exception as e:
print(f"处理 {file} 时出错:{e}")
# 记录错误,继续处理下一个
continue
else:
print(f"{file} 处理成功,无异常")
finally:
print(f"{file} 处理结束,清理临时文件")
print("所有文件处理完毕")
你看,这个脚本里用到了 for 循环遍历文件、if 判断文件是否存在、continue 跳过异常文件、try/except 处理各种错误。这就是流程控制在实际项目中的样子。
本章总结:
- 条件判断让代码能做决策,注意条件的顺序
- for 循环适合遍历已知集合,while 循环适合条件驱动
- break 终止循环,continue 跳过本次
- 异常处理要具体,别吞错误
- 流程控制组合使用,才能写出健壮的 RPA 脚本
好了,这一章的内容就到这里。流程控制是编程的骨架,一定要多练。下一章我们会讲函数和模块,到时候这些知识都会用上。有什么问题,欢迎随时交流。