大家好,今天我们不聊高深的异步编程,也不谈复杂的装饰器。我想带你回到最基础、但也最容易被忽视的两个领域:迭代的本质 和 循环的控制。相信我,看完这篇,你写while循环的时候,会下意识地多看一眼time模块,因为——循环不加延迟,就像炒菜不放盐,没灵魂。
一、 什么是“可迭代”?Python的“外卖清单”哲学
在Python里,我们经常听到一个词叫 Iterable(可迭代对象)。别被术语吓到,你可以把它理解成一份可以逐行查看的外卖清单。
只要这个对象能“一个接一个地往外蹦元素”,它就是可迭代的。比如我们最常用的列表(List)、元组(Tuple)、字符串(String),甚至是文件对象。
# 字符串是可迭代的
for char in "Python":
print(char) # 它会依次输出 P, y, t, h, o, n
# 字典也是可迭代的(默认是Key)
menu = {"name": "螺蛳粉", "price": 18}
for key in menu:
print(f"键是:{key}")
为什么我们非要搞清楚这个概念?因为只有可迭代的对象,才能被for循环“宠幸”。如果你写代码报错TypeError: 'int' object is not iterable,那就是你把整数当成了清单去遍历,Python直接翻脸了。
二、 while 循环:别让电脑“死机”,学会“刹车”
很多初学Python的朋友觉得for循环就够了。但while循环才是真正的“凭感觉走”——只要条件为真,它就敢一直跑。
1. 基础结构:计数器是我们的“刹车片”
count = 0
while count < 5:
print(f"当前计数: {count}")
count += 1 # 千万别忘这行!否则就是无限循环,电脑风扇呼呼转
2. 实战案例:while 配合 time 模块做“倒计时炸弹”
这里我要引入今天的主角之二:time 模块。在做循环时,加上sleep(休眠)能让程序有“呼吸感”,特别适合做倒计时或轮询任务。
import time
print(" 炸弹即将引爆,倒计时开始!")
countdown = 5
while countdown > 0:
print(f"倒计时: {countdown}")
countdown -= 1
time.sleep(1)
print(" Boom!!!")
三、 while 的高光时刻:优雅地揪出“质数”
质数是编程入门的经典题。它的定义是:大于1的自然数,除了1和它本身,不再有其他因数。
如果用for循环,我们通常用range硬算。但今天我们用while来实现,顺便感受一下break和else在循环里的“黄金搭档”。
代码实现:判断一个数是否为质数
value = 997
is_prime = True
for i in range(2, value):
if value % i == 0:
print(f"{i} 是 {value} 的因子 {value}不是质数")
is_prime = False
break
if is_prime:
print(f"{value}是质数")
value = 9
for i in range(2, value):
if value % i == 0:
print(f"{i} 是 {value} 的因子 {value}不是质数")
break
else:
print(f"{value}是质数")
你会发现,while在这里比for更灵活。我们可以动态控制除数i的变化,甚至可以在中间插入复杂的逻辑判断。这就是while的底气——掌控感。
四、 time 模块进阶:别让循环“跑冒滴漏”
在实际业务中,time模块不只是用来做倒计时的。在循环里,它有三个高频用法:
| time.sleep(sec) | 让程序挂起指定的秒数 | 爬虫加延迟,防止被封IP |
| time.time() | 返回当前时间戳(浮点数) | 计算循环耗时,做性能测试 |
| time.strftime() | 格式化输出当前时间 | 记录循环每一步的日志时间戳 |
实战小技巧:计算循环跑了多久
import time
start_time = time.time()
count = 0
while count < 3:
print(f"处理第 {count+1} 条数据…")
time.sleep(0.5)
count += 1
end_time = time.time()
print(f"循环总耗时: {end_time – start_time:.2f} 秒")
五、 总结与避坑指南(血的教训)
今天的知识点虽然基础,但我敢打赌你一定踩过以下坑:
死循环黑洞:while True 里面忘了写 break 或修改条件。解决方法:写循环前,先写退出条件。
time.sleep() 放错位置:如果你把sleep放在循环外,那就没意义了。只有放在循环体内部,每次迭代才会计时。
可迭代对象被耗尽:迭代器(如生成器)只能用一次。如果你用while去遍历一个迭代器,记得处理StopIteration异常,或者直接用for省心。
最后说句掏心窝的话:
很多人追求花哨的框架,却忽略了while和time这对“黄金配角”。当你需要做一个实时监控脚本、轮询数据库状态、或者游戏主循环时,你会发现——最基础的东西,才是支撑你程序灵魂的地基。
希望这篇内容对你有帮助。如果觉得写得还算生动,点赞、收藏、关注来一波,我们下篇博客见!





