菜单

Administrator
发布于 2026-10-16 / 1 阅读
0
0

Python P3:流程控制——让代码学会"分情况"和"重复干活"

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 比较运算符:造条件的工具

运算符

含义

例子

结果

==

等于

3 == 3

True

!=

不等于

3 != 4

True

>

大于

5 > 3

True

<

小于

5 < 3

False

>=

大于等于

5 >= 5

True

<=

小于等于

4 <= 5

True

新手最容易踩的坑:= 是赋值,== 才是比较。

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("正常")

执行逻辑像查岗,一个个往下问:

  1. 75 > 90?False,跳过

  2. 75 > 70?True,打印"警告",后面整个不再看了

  3. 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 < 3 True,打印,count 变成 1

  • 第 2 轮:1 < 3 True,打印,count 变成 2

  • 第 3 轮:2 < 3 True,打印,count 变成 3

  • 第 4 轮:3 < 3 False,结束

新手坟场:忘了写 count = count + 1,条件永远 True,程序转到天荒地老——这叫死循环,只能 Ctrl+C 强行停。写 while 先想好"什么时候停"。

for vs while:用哪个?

场景

用谁

为什么

遍历一个列表/字典

for

有几个干几轮,干完自动停

重复固定次数

for i in range(n)

次数已知

不知道要干几轮,看条件

while

比如"连不上就重试,最多等服务起来"

等某个事件发生

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 就报警 → 最后汇总。这就是运维脚本的骨架。


小结

知识点

一句话

if/elif/else

分情况,一组只执行一个分支

比较运算符

== 比较、= 赋值,别混

and/or/not

且 / 或 / 非,组合条件

for

把一筐东西挨个过一遍,个数已知时用

range()

数数,range(5) 是 0~4

while

条件成立一直干,记得写退出条件,防死循环

break

整个循环结束

continue

跳过这一轮

for + if

遍历边筛选,日志分析的雏形

下一课 P4:字典——给数据贴标签,按名字取值,以及函数返回字典的实战配合。


评论