上一篇讲脚本怎么做一次判断,这一篇讲怎么重复干同一件事。循环(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 + 1i 每轮 +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 + 1

login_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+CCtrl+Z 停掉。
  • 有意为之 —— 有些服务本来就要一直跑、不停处理数据,比如 Web 服务器、日志监听进程。这种”无限循环”是设计如此。

区别只在于:你是不是故意的。


一句话总结

遍历现成序列用 for,按条件反复跑用 while;range() 帮你按数字循环(记住终点不含);break 收工、continue 略过本轮。当你能让脚本自动扫完一整份资产清单、一整份日志,而不是手动一条条看,你就真正开始用 Python 替自己干安全里的重复活了。下一步,就是把循环里每一轮的判断交给条件语句