上一篇讲脚本怎么做一次判断,这一篇讲怎么重复干同一件事。循环(iterative statement)就是让一段代码反复执行的结构——根据条件,它可能跑零次、几次,或无数次。
安全分析师为什么要会?你要处理的从来不是一条数据,而是一批:一整个资产清单、一整份日志、一串 IP。挨个处理它们,靠的就是循环。
先看全景:两种循环,怎么选
for 循环 | while 循环 | |
|---|---|---|
| 什么时候用 | 已知要遍历一个序列 | 根据一个条件反复跑 |
| 跑几次 | 序列有几个元素就几次 | 直到条件变 False 才停 |
| 循环变量 | 在头部里(for i in ...) | 在循环外先赋值 |
| 典型场景 | 遍历资产清单、日志行、字符串 | ”登录次数 < 5 就继续""服务一直跑” |
两个控制关键字,放在循环体内的 if 里:
| 关键字 | 作用 |
|---|---|
break | 直接退出整个循环 |
continue | 跳过这一轮,继续下一轮 |
语法铁律和条件语句一样:头部结尾加冒号 :,循环体要缩进。
for 循环:遍历一个序列
要遍历一个已知序列(列表、字符串等),用 for:
for i in ["elarson", "bmoreno", "tshah", "sgilmore"]:
print(i)拆开看:
- 头部 ——
for i in [...]:。for开启循环,紧跟着是循环变量i(控制每轮迭代的变量)。in后面是要遍历的序列。头部结尾必须冒号。 - 循环体 —— 缩进的
print(i),说明每轮要干什么。这里是打印当前循环变量的值。
每轮 i 自动取序列里的下一个元素,直到遍历完。
遍历列表(最常用)
computer_assets = ["laptop1", "desktop20", "smartphone03"]
for asset in computer_assets:
print(asset)第一轮 asset 是 “laptop1”,第二轮是 “desktop20”……挨个处理一份资产清单,就是这个套路。
也能遍历字符串(逐个字符)
string = "security"
for character in string:
print(character) # 一行一个字母:s e c u r i t y
in的两副面孔:在for里,in后面跟”要遍历的序列”;在条件语句里,in用来判断”某个东西在不在序列里”。比如if "elarson" in ["tshah", "bmoreno", "elarson"]结果是 True。同一个词,两种用法别混。
range():按数字序列循环
不想遍历现成的列表,而是想”跑 N 次”?用 range() 生成一串数字。它接收起点、终点、步长三个参数:
for i in range(0, 5, 1): # 从 0 开始,到 5 停,每次 +1
print(i) # 输出 0 1 2 3 4关键:起点含、终点不含。
range(0, 5, 1)给的是 0~4,不包括 5——停在终点前一个数。这是新手最容易数错的地方。
起点默认 0、步长默认 1,所以这两个是默认值时可以省略:
for i in range(5): # 等价于 range(0, 5, 1)
print(i) # 同样输出 0 1 2 3 4但终点永远要写;起点不是 0、或步长不是 1 时,就得显式写出来。
while 循环:满足条件就一直跑
要”根据条件反复执行”,用 while。只要条件为 True 就继续,变 False 就退出:
i = 1
while i < 5:
print(i)
i = i + 1和 for 的关键不同:
- 循环变量在循环外赋值 —— 这里
i = 1写在循环前面,不在头部。 - 必须在循环体里改变量 ——
i = i + 1让i每轮 +1,否则条件永远成立 → 死循环。 - 条件用和条件语句一样的比较运算符,头部结尾同样要冒号。
这个例子跑 4 次(i 从 1 到 4),i 变 5 时条件 5 < 5 为 False,退出。
用整数控制:限制登录次数
login_attempts = 0
while login_attempts < 5:
print("Login attempts:", login_attempts)
login_attempts = login_attempts + 1login_attempts 从 0 加到 4(共 5 次)就停——“允许登录不超过 5 次”这种安全逻辑,天然就是 while 循环。
用布尔值控制:满足某条件就翻闸
条件也可以是布尔判断。下面用一个 login_status 开关,数到 4 就把它关掉,从而退出:
count = 0
login_status = True
while login_status == True:
print("Try again.")
count = count + 1
if count == 4:
login_status = False打印 4 次 “Try again.” 后,login_status 被设为 False,循环退出。这种”用一个标志位控制循环”的写法在实战里很常见。
控制节奏:break 和 continue
两个都写在循环体内的 if 里,条件为 True 时触发。
break —— 直接跳出整个循环
computer_assets = ["laptop1", "desktop20", "smartphone03"]
for asset in computer_assets:
if asset == "desktop20":
break
print(asset)遇到 “desktop20” 就 break,整个循环结束——所以只打印了 “laptop1”,“desktop20” 和后面的 “smartphone03” 都没打印。
安全场景:在日志里一找到某个 IoC 就停下,不用扫完整个文件。
continue —— 只跳过这一轮
computer_assets = ["laptop1", "desktop20", "smartphone03"]
for asset in computer_assets:
if asset == "desktop20":
continue
print(asset)遇到 “desktop20” 就 continue,跳过这一轮但循环继续——所以 “desktop20” 没打印,但 “smartphone03” 打印了。
安全场景:遍历资产时跳过白名单里的项,继续检查其余的。
一句话记区别:break 是”收工走人”,continue 是”这条略过,下一条”。
无限循环:有意为之 or 翻车现场
如果循环永远不退出,就是无限循环(infinite loop)。两种情况:
- 翻车 —— while 条件永远成立(比如忘了在循环体里改循环变量)。误入死循环时,按 Ctrl+C 或 Ctrl+Z 停掉。
- 有意为之 —— 有些服务本来就要一直跑、不停处理数据,比如 Web 服务器、日志监听进程。这种”无限循环”是设计如此。
区别只在于:你是不是故意的。
一句话总结
遍历现成序列用 for,按条件反复跑用 while;range() 帮你按数字循环(记住终点不含);break 收工、continue 略过本轮。当你能让脚本自动扫完一整份资产清单、一整份日志,而不是手动一条条看,你就真正开始用 Python 替自己干安全里的重复活了。下一步,就是把循环里每一轮的判断交给条件语句。