日期:2025/04/04 20:17来源:未知 人气:54
“为什么别人的代码优雅高效,而你的for循环又长又慢?”
在Python中,for
循环是每个开发者都会用的基础结构,但会用≠懂原理 !
今天,带你深入解剖for循环的底层逻辑,掌握迭代器、生成器、性能优化 等硬核知识,让你的代码效率翻倍!
for 临时变量 in 可迭代对象:
else:
👉 划重点 :
• 可迭代对象
:列表、字符串、字典……甚至文件!
• else
的存在感极低,但面试可能会考哦!
可迭代对象(Iterable)
• 特征 :能用for
循环遍历的都是它!
• 隐藏技能 :必须实现__iter__()
方法(返回一个迭代器)。
迭代器(Iterator)
• 特征 :实现__next__()
方法,像“一次性水杯”,用完就扔。
• 冷知识 :迭代器自己也是可迭代对象!(套娃警告⚠️)
💡 举个栗子 :
data = [1,2,3] iterator = iter(data) # 召唤迭代器 whileTrue: try: print(next(iterator)) # 疯狂抓取下一个元素 except StopIteration: # 抓到头了就溜 break
生成器(Generator)是懒人版迭代器 ,用yield
动态生成值,省内存神器 !
def 无限计数器(): num = 0 whileTrue: yield num num += 1
for n in 无限计数器(): if n > 5: break print(n) # 输出0,1,2,3,4,5
👉 适用场景 :处理超大文件、流式数据时,生成器能让内存感激涕零!
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()
比手动循环更快!
让你的类支持for
循环,只需实现__iter__()
和__next__()
!
class 自定义计数器: definit(self, start, end): self.current = start self.end = end
defiter(self): return self # 我自己就是迭代器!
defnext(self): if self.current > self.end: raise StopIteration else: self.current += 1 return self.current - 1
for num in 自定义计数器(1, 5): print(num) # 输出1,2,3,4,5
• break
:立刻结束循环(连else也不执行!)
• else
:只有循环自然死亡 时才会触发!(被break干掉的不算)
for num in [1,2,3]: if num == 2: break else: print("循环平安结束~") # 永远不会执行!
你遇到过哪些for循环的坑? 欢迎在评论区吐槽! 如果觉得有用,记得转发 给身边的程序员小伙伴哦!