Python神技:彻底搞懂for循环的8个核心要点!
“为什么别人的代码优雅高效,而你的for循环又长又慢?”
在Python中,for
循环是每个开发者都会用的基础结构,但会用≠懂原理!
今天,带你深入解剖for循环的底层逻辑,掌握迭代器、生成器、性能优化等硬核知识,让你的代码效率翻倍!
一、从零开始:for循环的“标准姿势”
for 临时变量 in 可迭代对象:
# 干活代码
else:
# 没人用的冷门知识:循环没被break时执行这里
👉 划重点:
• 可迭代对象
:列表、字符串、字典……甚至文件!
• else
的存在感极低,但面试可能会考哦!
二、灵魂拷问:可迭代对象 vs 迭代器,到底啥区别?
-
可迭代对象(Iterable)
• 特征:能用for
循环遍历的都是它!
• 隐藏技能:必须实现__iter__()
方法(返回一个迭代器)。 -
迭代器(Iterator)
• 特征:实现__next__()
方法,像“一次性水杯”,用完就扔。
• 冷知识:迭代器自己也是可迭代对象!(套娃警告⚠️)
💡 举个栗子:
# 手动模拟for循环的底层操作
data = [1,2,3]
iterator = iter(data) # 召唤迭代器
while True:
try:
print(next(iterator)) # 疯狂抓取下一个元素
except StopIteration: # 抓到头了就溜
break
三、for循环的“高速引擎”:生成器
生成器(Generator)是懒人版迭代器,用yield
动态生成值,省内存神器!
def 无限计数器():
num = 0
while True:
yield num
num += 1
# 用法和普通for循环一模一样!
for n in 无限计数器():
if n > 5:
break
print(n) # 输出0,1,2,3,4,5
👉 适用场景:处理超大文件、流式数据时,生成器能让内存感激涕零!
四、打工人必备:for循环的8种搬砖姿势
1、遍历字典:
d = {"A": 1, "B": 2}
for key in d: # 遍历键
for val in d.values(): # 遍历值
for k, v in d.items(): # 键值对一起拿捏
2、带索引遍历:用enumerate
获取序号!
for idx, value in enumerate(["苹果", "华为"]):
print(f"第{idx}个手机品牌:{value}")
3、 多列表并行:zip
像拉链一样合并数据!
names = ["小明", "小红"]
scores = [90, 85]
for name, score in zip(names, scores):
print(f"{name}考了{score}分")
五、性能优化:少写一行,效率翻倍!**
• 黑名单行为:在循环中修改正在遍历的列表!(可能导致元素跳过或重复)
✅ 正确姿势:遍历副本或新建列表。
• 替代方案:
• 列表推导式:[x**2 for x in range(10)]
(简洁高效)
• 内置函数:map()
、filter()
比手动循环更快!
六、装X必备:自定义可迭代对象
让你的类支持for
循环,只需实现__iter__()
和__next__()
!
class 自定义计数器:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self # 我自己就是迭代器!
def __next__(self):
if self.current > self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1
# 使用效果和普通for循环完全一致!
for num in 自定义计数器(1, 5):
print(num) # 输出1,2,3,4,5
七、避坑指南:循环中的break和else
• break
:立刻结束循环(连else也不执行!)
• else
:只有循环自然死亡时才会触发!(被break干掉的不算)
for num in [1,2,3]:
if num == 2:
break
else:
print("循环平安结束~") # 永远不会执行!
你遇到过哪些for循环的坑? 欢迎在评论区吐槽!
如果觉得有用,记得转发给身边的程序员小伙伴哦!