For (循环)
Python 的 for 循环本质是:
iterator = iter(obj)
while True:
try:
item = next(iterator)
except StopIteration:
break
这意味着:
- 任何可迭代对象都能 for(list、tuple、dict、str、set、file、generator)
- 底层依赖 iter() 和 next()
for item in iterable:
...
例子:
for i in [1, 2, 3]:
print(i)
for i in range(5):
print(i)
range 也是一个惰性对象(不会一次性产生列表)。
迭代 key:
for k in d:
print(k)
迭代 key-value:
for k, v in d.items():
print(k, v)
迭代 value:
for v in d.values():
print(v)
for idx, value in enumerate(items):
print(idx, value)
带起始值:
enumerate(items, start=1)
for a, b in zip(list1, list2):
print(a, b)
else 在循环 正常结束(不是 break)时执行。
例子:
for x in items:
if x == target:
print("found")
break
else:
print("not found")
用途:搜索逻辑。
生成器惰性产出数据:
def gen():
for i in range(3):
yield i
for x in gen():
print(x)
迭代器只能遍历一次:
it = iter([1,2,3])
for x in it:
print(x)
# 再遍历 -> 没有数据了
for x in it:
print(x) # 不打印
result = [x*x for x in range(10)]
等价于:
result = []
for x in range(10):
result.append(x*x)
集合推导:
s = {x*x for x in range(10)}
字典推导:
d = {x: x*x for x in range(10)}
for x in items:
if x < 0:
continue
if x == 0:
break
pairs = [(1,2),(3,4)]
for a, b in pairs:
print(a, b)
for i in range(3):
for j in range(2):
print(i, j)
for chunk in iter(lambda: f.read(1024), b''):
process(chunk)
作用:持续读取直到遇到某个“终止符”。
非常用于文件流。
Python 访问局部变量最快。
慢:
for x in data:
result.append(x)
快:
append = result.append
for x in data:
append(x)
生成器不会占用内存,提升性能。
- list / tuple / set / dict
- file 句柄
- str
- range
- generator / yield
- zip / map / filter / enumerate
- 自定义实现
__iter__
class MyRange:
def __init__(self, end):
self.i = 0
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.i < self.end:
self.i += 1
return self.i - 1
raise StopIteration
for x in MyRange(5):
print(x)
错误:
for x in items:
items.remove(x)
正确:
for x in items[:]:
items.remove(x)
或:
items = [x for x in items if ...]
- 遍历数据结构
- 读取大文件
- 数据流处理
- 消费队列(如 Redis / Kafka)
- 实现生成器算法
- 数据过滤、变换
- for 是对迭代器协议的语法糖。
- 支持所有“可迭代对象”。
- range 是惰性的,不会一次性生成列表。
- for…else 仅在循环正常结束时执行。
- enumerate 用于需要下标的遍历。
- zip 支持并行遍历。
- 列表推导式 = 快速 for + append。
- 迭代器只能遍历一次。
- iter(func, sentinel) 是很强大的高级技巧。
- 避免在遍历中修改原始列表或字典。
以下是 最清晰、最经典的 Python for ... else 示例。
numbers = [1, 3, 5, 7, 9]
target = 4
for n in numbers:
if n == target:
print("找到了!")
break
else:
print("没找到目标数字")
执行结果:
没找到目标数字
🔍 原因:
- for 遍历 正常结束,没有触发 break
- 所以执行 else
numbers = [1, 3, 4, 5, 7]
target = 4
for n in numbers:
if n == target:
print("找到了!")
break
else:
print("没找到目标数字")
输出:
找到了!
🔍 原因:
- 遇到 break -> 直接跳出循环
- 不执行 else
s = "hello world"
for ch in s:
if ch.isdigit():
print("包含数字")
break
else:
print("不包含数字")
输出:
不包含数字
num = 17
for i in range(2, num):
if num % i == 0:
print("不是素数")
break
else:
print("是素数")
输出:
是素数
如果整段循环没有 break,说明没找到能整除的数字 -> 是素数。
for ... else 中的 else 只有循环没有执行 break 时才会执行。
❌ 和 if-else 完全无关
✅️ 是 break 控制的 else