4. 流程控制:if判断语句、运算符、if-else语句、while循环、for循环、break、continue
各位同学,欢迎来到第四章。
前面我们学了变量、数据类型,还有怎么跟外部系统打交道。但说实话,那些都是「静态」的。真正的自动化流程,得会「思考」、会「判断」、会「重复干活」。这一章,我们就来搞定这些核心能力。
4.1 运算符:判断的基础
在讲if之前,得先聊聊运算符。你想想看,计算机怎么知道「5大于3」?怎么知道「A等于B」?靠的就是运算符。
我习惯把运算符分成三类:
- 比较运算符:
==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于) - 逻辑运算符:
and(且)、or(或)、not(非) - 算术运算符:
+、-、*、/、%(取余)
if score == 100,而不是 if 100 == score。这样读起来更自然,像在说「如果分数等于100」。
运算符的结果只有两种:True 或 False。说白了,就是「是」或「否」。计算机就靠这个做决策。
4.2 if判断语句:让流程学会选择
if语句,是流程控制里最基础、也最常用的结构。它的逻辑很简单:如果条件成立,就执行某段代码。
基本写法:
if 条件:
执行的动作
举个例子。我在做一个自动登录流程时,需要先判断登录按钮是否存在:
login_button = 页面.查找元素("登录按钮")
if login_button != None:
页面.点击(login_button)
页面.输入("用户名", "admin")
页面.输入("密码", "123456")
这里 login_button != None 就是一个条件判断。如果按钮存在,就执行登录操作。不存在?那就什么都不做。
if login_button = None,少写一个等号。一个等号是赋值,两个等号才是比较。我曾经因为这个bug排查了整整一下午,后来养成了习惯:写if条件时,先检查等号数量。
4.3 if-else语句:两条路,选一条
if只能处理「条件成立」的情况。那条件不成立呢?这时候就需要if-else了。
if 条件:
条件成立时执行
else:
条件不成立时执行
我记得有一次做发票自动识别流程。需要判断发票类型:
invoice_type = 识别.发票类型(图片)
if invoice_type == "增值税专用发票":
处理.抵扣进项税(发票)
else:
处理.普通报销(发票)
你看,一个if-else,就把两种发票的处理路径分开了。这就是流程控制的核心——让机器根据实际情况走不同的路。
如果判断条件不止两个呢?用 if-elif-else:
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")
这里要注意顺序。条件是从上往下依次判断的,一旦匹配就跳出整个结构。所以要把最严格的条件放在最前面。
4.4 while循环:重复,直到条件不满足
if是「判断一次」,while是「判断多次」。只要条件为True,就一直执行下去。
while 条件:
重复执行的动作
我做过一个自动下载报表的流程。报表每天生成,但生成时间不确定。我就用while循环来「等」:
报表状态 = "未生成"
while 报表状态 != "已生成":
报表状态 = 查询.报表状态()
等待(60) # 每分钟检查一次
下载.报表()
这个循环会一直运行,直到报表状态变成「已生成」。嗯,这里要注意:一定要确保循环条件最终会变成False,否则就是死循环。
1. 这个循环什么时候结束?
2. 条件变量在循环体里更新了吗?
3. 有没有设置最大循环次数做保护?
4.5 for循环:遍历,一个接一个
while适合「不知道要循环多少次」的场景。如果知道要遍历一组数据,用for循环更合适。
for 变量 in 可遍历对象:
对每个变量执行动作
举个例子。批量处理Excel中的多行数据:
rows = Excel.读取所有行("订单表.xlsx")
for row in rows:
订单号 = row[0]
金额 = row[1]
处理.生成发货单(订单号, 金额)
for循环会自动遍历每一行,处理完一行自动进入下一行。不需要手动控制索引,也不容易出错。
如果想控制循环次数,可以用 range():
for i in range(5):
print(f"第{i+1}次循环")
range(5) 会生成0、1、2、3、4这五个数字。循环执行5次。
4.6 break和continue:控制循环的「刹车」和「跳过」
循环虽然好用,但有时候我们需要在特定条件下提前退出,或者跳过某次循环。这时候就需要break和continue了。
break:立即终止整个循环
我在做网页爬虫时,经常需要翻页抓取数据。但有时候翻到最后一页,或者遇到错误页面,就需要停下来:
for page in range(1, 100):
数据 = 爬取.获取页面(f"https://example.com/page/{page}")
if 数据 == None:
print("没有更多数据了,停止翻页")
break
保存.数据(数据)
这里break的作用是:一旦发现数据为空,立刻跳出循环,不再继续翻页。
continue:跳过当前这次,继续下一次
continue和break不同。break是「全剧终」,continue是「这一集跳过」。
for 订单 in 订单列表:
if 订单.金额 < 0:
print(f"订单{订单.编号}金额异常,跳过处理")
continue
处理.发货(订单)
遇到金额为负的订单,就跳过这次处理,继续处理下一个订单。整个循环不会终止。
- 循环体超过20行,考虑拆分成函数
- break和continue加起来不超过2个
- 能用if-else解决的,就别用break
4.7 综合案例:自动处理待办事项
最后,我们把这些知识点串起来,写一个完整的自动化流程:
待办列表 = 获取.待办事项()
已处理 = 0
失败 = 0
for 事项 in 待办列表:
if 事项.状态 == "已完成":
continue # 跳过已完成的
if 事项.截止日期 < 今天():
print(f"事项{事项.编号}已过期,标记为紧急")
事项.标记紧急()
结果 = 处理.自动处理(事项)
if 结果 == "成功":
已处理 += 1
else:
失败 += 1
if 失败 >= 3:
print("连续失败3次,停止处理")
break
print(f"处理完成。成功:{已处理},失败:{失败}")
这个案例里,我们用到了for循环遍历、if判断状态、continue跳过已完成、break防止连续失败。你看,流程控制的核心思想就是:让程序像人一样,能判断、能重复、能灵活应对各种情况。
下一章,我们会学习函数和模块。到时候,这些流程控制语句会变得更加强大。今天就到这里,动手写几个循环练练手吧。