Python P3:流程控制——让代码学会"分情况"和"重复干活"
前面 P1 写下了第一行代码,P2 认识了变量和各种数据类型。程序到现在还只是"从上往下念经"——一行接一行,不拐弯、不重复。
但真实世界不是这样的:磁盘满了才告警、日志有一万行要一行行看、100 台服务器要一台台巡检。流程控制就是教程序两件事:分情况(if)和重复(for/while)。学会这篇,你的 Python 才算真正"活"起来。
一、if:分情况办事
1.1 最基本的 if
disk_usage = 95
if disk_usage > 90:
print("磁盘快满了,快去清理!")
逐行拆:
if disk_usage > 90:——if开头,后面跟一个条件(能算出 True/False 的表达式),冒号结尾缩进的
print(...)—— 条件成立才执行的代码disk_usage是 95,95 > 90是 True,所以打印那句话如果把 95 改成 50,条件是 False,缩进里的代码直接跳过,什么都不发生
记住这个形状:if 条件: + 冒号 + 缩进。冒号和缩进是一对,缺一不可——P1 讲过,缩进就是 Python 的"大括号"。
1.2 比较运算符:造条件的工具
新手最容易踩的坑:= 是赋值,== 才是比较。
name = "Chris" # 赋值:把 "Chris" 装进 name
name == "Chris" # 比较:问 name 里是不是 "Chris",得到 True
写 if name = "Chris": 会直接报错——if 后面要的是能算出 True/False 的表达式,赋值语句不算。
1.3 else:否则
disk_usage = 50
if disk_usage > 90:
print("磁盘快满了,快去清理!")
else:
print("磁盘空间充足")
else 的意思是"上面条件不成立时走这里"。注意 else: 后面不跟条件,也是冒号+缩进。
1.4 elif:好几种情况
disk_usage = 75
if disk_usage > 90:
print("严重:磁盘快爆了!")
elif disk_usage > 70:
print("警告:磁盘用了七成以上")
else:
print("正常")
执行逻辑像查岗,一个个往下问:
75 > 90?False,跳过75 > 70?True,打印"警告",后面整个不再看了else直接跳过
关键:if/elif/else 一组里只执行一个分支,命中就停。elif 可以写很多个,else 最多一个、而且只能在最后。
1.5 组合条件:and、or、not
cpu = 95
memory = 92
if cpu > 90 and memory > 90:
print("CPU 和内存都爆了!")
if cpu > 90 or memory > 90:
print("至少有一个爆了")
if not cpu > 90:
print("CPU 还好")
and:两边都 True 才 True("且")or:一边 True 就 True("或")not:取反,True 变 False
服务器巡检脚本里最常见的就是这种组合:if cpu > 90 and memory > 90:。
二、for:把一筐东西挨个过一遍
2.1 基本形状
fruits = ["苹果", "香蕉", "橘子"]
for fruit in fruits:
print("找到了:", fruit)
输出:
找到了: 苹果
找到了: 香蕉
找到了: 橘子
拆开看:
for fruit in fruits:——for开头,fruit是"手"(每轮抓到的东西放这里),in后面是"筐"(要遍历的东西),冒号结尾缩进的
print(...)是循环体,每轮执行一遍第 1 轮
fruit是"苹果",第 2 轮是"香蕉",第 3 轮是"橘子",筐空了就结束
fruit 这个变量名是随便起的,但要见名知意——遍历水果叫 fruit,遍历服务器叫 server。
2.2 for + if:边遍历边筛选
这是服务器脚本里出镜率最高的组合:
nums = [1, 2, 3, 4, 5, 6]
evens = []
for num in nums:
if num % 2 == 0:
evens.append(num)
print(evens)
输出:[2, 4, 6]
% 是取余数,num % 2 == 0 就是"能不能被 2 整除"。逻辑:挨个看数字,是偶数就装进 evens 列表。
换成日志场景,一模一样:
logs = [
"2026-10-14 10:23:45 INFO 服务启动",
"2026-10-14 10:24:01 ERROR 磁盘满了",
"2026-10-14 10:24:02 INFO 心跳正常",
"2026-10-14 10:25:10 ERROR 连接超时",
]
for log in logs:
if "ERROR" in log:
print(log)
输出两条 ERROR 日志。遍历 + 条件筛选,就是日志分析脚本的雏形。
2.3 range():数数专用
for i in range(5):
print(i)
输出 0 1 2 3 4。range(5) 生成 0 到 4,不包括 5。
for i in range(1, 6):
print(i) # 1 2 3 4 5
for i in range(0, 10, 2):
print(i) # 0 2 4 6 8,第三个参数是步长
巡检 3 台服务器:
servers = ["web1", "web2", "db1"]
for server in servers:
print(f"正在巡检 {server} ...")
2.4 遍历字典
server = {"ip": "3.15.231.19", "os": "Debian", "memory": "8G"}
for key, value in server.items():
print(key, value)
输出:
ip 3.15.231.19
os Debian
memory 8G
for key in server 默认只抓键;.items() 一次给一对 (键, 值),for key, value in 左右手各接一个。字典的完整用法见 P4。
三、while:条件成立就一直干
count = 0
while count < 3:
print(f"第 {count + 1} 次尝试连接")
count = count + 1
输出:
第 1 次尝试连接
第 2 次尝试连接
第 3 次尝试连接
while 的逻辑:每次循环前先看条件,True 就再干一轮,False 就停。
第 1 轮:
0 < 3True,打印,count变成 1第 2 轮:
1 < 3True,打印,count变成 2第 3 轮:
2 < 3True,打印,count变成 3第 4 轮:
3 < 3False,结束
新手坟场:忘了写 count = count + 1,条件永远 True,程序转到天荒地老——这叫死循环,只能 Ctrl+C 强行停。写 while 先想好"什么时候停"。
for vs while:用哪个?
一句话:个数已知的用 for,个数未知的用 while。
四、break 和 continue:循环里的"急停"和"跳过"
for num in [1, 2, 3, 4, 5]:
if num == 3:
break
print(num)
输出 1 2。break = 整个循环直接结束,后面几轮都不干了。
for num in [1, 2, 3, 4, 5]:
if num == 3:
continue
print(num)
输出 1 2 4 5。continue = 这一轮跳过,直接进下一轮。
实战:找第一个爆了的磁盘,找到就不用再找了:
disks = ["/dev/sda1 45%", "/dev/sdb1 97%", "/dev/sdc1 60%"]
for disk in disks:
usage = int(disk.split()[1].replace("%", ""))
if usage > 90:
print(f"发现爆盘:{disk}")
break
五、综合实战:日志巡检小脚本
把 P2 的切分、f-string 和这篇的 for/if 组装起来:
logs = [
"2026-10-14 10:23:45 INFO 服务启动完成",
"2026-10-14 10:24:01 ERROR /var/log 磁盘满了",
"2026-10-14 10:24:02 INFO 心跳正常",
"2026-10-14 10:25:10 ERROR 连接数据库超时",
]
error_count = 0
for log in logs:
parts = log.split()
level = parts[2]
time = parts[1]
if level == "ERROR":
error_count = error_count + 1
print(f"[{time}] 发现错误:{log}")
print(f"共发现 {error_count} 条错误")
输出:
[10:24:01] 发现错误:2026-10-14 10:24:01 ERROR /var/log 磁盘满了
[10:25:10] 发现错误:2026-10-14 10:25:10 ERROR 连接数据库超时
共发现 2 条错误
看,一个能用的日志巡检脚本已经成型了:遍历每一行 → 切分 → 取级别 → 是 ERROR 就报警 → 最后汇总。这就是运维脚本的骨架。
小结
下一课 P4:字典——给数据贴标签,按名字取值,以及函数返回字典的实战配合。