正在阅读Python 的 while 与 for:三个循环示例
香港天气加载中…
QWeather ↗
← Back to the notebook

Python 的 while 与 for:三个循环示例

从动态步长、条件终止到用户交互,理解 while 与 for 的控制机制,以及两者的适用场景。

先理解:谁决定下一轮?

在 Python 中,说 while 的自由度更高,可以理解为:你能直接管理循环条件和状态更新。for 则根据迭代器获取下一项。

循环每一轮开始时发生什么
while condition重新判断条件;条件为真时执行循环体。
for item in iterable从迭代器取下一项,赋给循环变量,然后执行循环体。

下面三个示例分别展示动态推进、按条件停止,以及等待用户决定何时退出。

示例一:根据当前值改变步长

规则是:当前值为偶数时加 3,为奇数时加 1。在 while 中,对 i 的修改会影响下一轮的位置。

下面的输出为:while: 0 3 4 7 8;for: 0 1 2 3 4 5 6 7 8 9。虽然两段代码都修改了 i,但 for 下一轮会从 range(10) 取出下一个值,重新赋给 i,因此遍历顺序没有改变。

3 if i % 2 == 0 else 1 是条件表达式:i 为偶数时取 3,否则取 1。

Python
print("while:")
i = 0

while i < 10:
    print(i, end=" ")
    i += 3 if i % 2 == 0 else 1

print("\nfor:")

for i in range(10):
    print(i, end=" ")
    i += 3 if i % 2 == 0 else 1

print()

示例二:根据计算结果决定何时结束

不断将一个数减半,直到它不大于 10。这里直接表达的是:只要条件成立,就继续计算,无需先计算应该循环多少次。

循环内依次输出 100、50.0、25.0、12.5。最后 x 变为 6.25,下一轮判断 x > 10 为假,循环结束。

Python
x = 100

while x > 10:
    print(x)
    x /= 2

print("结束时:", x)

示例三:由用户决定何时退出

在终端运行下面的代码。用户可以输入一次,也可以输入很多次;每轮收到输入后,程序才决定继续还是退出。

while True 的条件始终成立。输入 quit 时执行 break,立即结束循环。其他输入会显示在终端中。

Python
while True:
    command = input("输入命令,quit 退出:")

    if command == "quit":
        break

    print("收到:", command)

工程实践:等待任务就绪

测试自动化中的轮询也适合用 while 表达。这个函数接收状态检查函数 is_ready,就绪时返回 True,超过等待期限时返回 False。它用单调时钟衡量等待时间,并在两次检查间暂停,避免持续占用 CPU。

边界需要明确:is_ready() 必须及时返回。这里的期限不会中断一次阻塞的检查调用,因此不能保证函数严格在 timeout 秒内返回。

Python
from time import monotonic, sleep

def wait_until_ready(is_ready, timeout=10.0):
    deadline = monotonic() + timeout
    while monotonic() < deadline:
        if is_ready():
            return True
        sleep(0.2)
    return False

选择时看控制机制

遍历列表、文件或其他可迭代对象时,通常用 for;根据不断变化的状态决定是否继续时,通常用 while 更直观。

两者都支持 break 和 continue,for 也不要求提前知道循环次数。这里的“自由度”描述的是控制方式,不能据此认为 while 能完成更多种任务。使用 while 时,需要让状态更新、继续条件和退出路径相互配合。

参考:Python 官方文档:for 语句 ↗ · Python 官方文档:while 语句 ↗

PythonControl flow循环控制

This is an initial starter note, ready to expand with your own examples and experience.

MORE IN DEVELOPMENT理解递归:从函数调用到逐层返回