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。
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 为假,循环结束。
x = 100
while x > 10:
print(x)
x /= 2
print("结束时:", x)示例三:由用户决定何时退出
在终端运行下面的代码。用户可以输入一次,也可以输入很多次;每轮收到输入后,程序才决定继续还是退出。
while True 的条件始终成立。输入 quit 时执行 break,立即结束循环。其他输入会显示在终端中。
while True:
command = input("输入命令,quit 退出:")
if command == "quit":
break
print("收到:", command)工程实践:等待任务就绪
测试自动化中的轮询也适合用 while 表达。这个函数接收状态检查函数 is_ready,就绪时返回 True,超过等待期限时返回 False。它用单调时钟衡量等待时间,并在两次检查间暂停,避免持续占用 CPU。
边界需要明确:is_ready() 必须及时返回。这里的期限不会中断一次阻塞的检查调用,因此不能保证函数严格在 timeout 秒内返回。
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 时,需要让状态更新、继续条件和退出路径相互配合。