Python for循环的经典用法汇总
一、基础遍历
1. 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
2. 遍历字符串
for ch in "hello":
print(ch) # h e l l o
3. 遍历字典
d = {"name": "小明", "age": 25}
for key in d: # 遍历键
print(key)
for value in d.values(): # 遍历值
print(value)
for key, value in d.items(): # 遍历键值对(最常用)
print(key, value)
4. 遍历 range
for i in range(5): # 0,1,2,3,4
print(i)
for i in range(2, 10, 2): # 2,4,6,8
print(i)
for i in range(10, 0, -1):# 10,9,...,1 倒序
print(i)
二、带索引遍历
1. enumerate(最推荐)
fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits):
print(i, fruit)
# 0 apple
# 1 banana
# 2 cherry
# 指定起始索引
for i, fruit in enumerate(fruits, start=1):
print(i, fruit)
# 1 apple
# 2 banana
# 3 cherry
不要写 for i in range(len(fruits)):,用 enumerate 更 Pythonic。
2. 同时遍历两个列表:zip
names = ["小明", "小红", "小刚"]
ages = [25, 30, 28]
for name, age in zip(names, ages):
print(name, age)
# 小明 25
# 小红 30
# 小刚 28
zip 以最短的列表为准:
a = [1, 2, 3]
b = ["a", "b"]
for x, y in zip(a, b):
print(x, y) # 只输出 1 a 和 2 b
如果想以最长的为准,用 itertools.zip_longest。
3. 同时要索引和值:enumerate + zip
for i, (name, age) in enumerate(zip(names, ages)):
print(i, name, age)
三、列表推导式(for 的表达式版)
1. 基本形式
squares = [x**2 for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]
2. 带条件
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
3. 嵌套循环
pairs = [(x, y) for x in [1, 2] for y in ["a", "b"]]
print(pairs) # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
4. 字典推导式
squares = {x: x**2 for x in range(5)}
print(squares) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
5. 集合推导式
s = {x % 3 for x in range(10)}
print(s) # {0, 1, 2}
6. 生成器表达式(省内存)
gen = (x**2 for x in range(1000000)) # 不立即计算
print(next(gen)) # 0
print(next(gen)) # 1
# 求和,不用建大列表
total = sum(x**2 for x in range(1000000))
列表推导式 vs 生成器表达式:前者用 [],后者用 ()。数据大时用生成器。
四、for-else 结构
else 在循环正常结束(没被 break)时执行。
nums = [1, 3, 5, 7, 9]
for n in nums:
if n % 2 == 0:
print("找到偶数:", n)
break
else:
print("没有偶数")
# 输出:没有偶数
nums = [1, 2, 3]
for n in nums:
if n % 2 == 0:
print("找到偶数:", n)
break
else:
print("没有偶数")
# 输出:找到偶数: 2
典型用途:查找元素,找不到时做某事。
target = 6
nums = [1, 2, 3, 4, 5]
for n in nums:
if n == target:
print("找到了")
break
else:
print("没找到")
五、break、continue、pass
for i in range(10):
if i == 3:
continue # 跳过本次,继续下一次
if i == 7:
break # 直接结束循环
if i == 5:
pass # 占位,什么都不做
print(i)
# 输出:0 1 2 4 5 6
| 关键字 | 作用 |
|---|---|
break | 立即结束整个循环 |
continue | 跳过本次,进入下一次 |
pass | 占位,什么都不做 |
六、嵌套循环
for i in range(3):
for j in range(3):
print(i, j)
跳出多层循环的几种方法:
1. 用标志变量
found = False
for i in range(3):
for j in range(3):
if i == 1 and j == 1:
found = True
break
if found:
break
2. 用函数 + return
def find():
for i in range(3):
for j in range(3):
if i == 1 and j == 1:
return (i, j)
print(find()) # (1, 1)
3. 用 for-else
for i in range(3):
for j in range(3):
if i == 1 and j == 1:
print("找到")
break
else:
continue
break
最推荐第 2 种,把逻辑封装成函数。
七、遍历时修改列表的坑
不要在遍历列表时增删元素,会导致跳过或死循环。
nums = [1, 2, 3, 4, 5]
# ❌ 错误写法
for n in nums:
if n % 2 == 0:
nums.remove(n)
print(nums) # [1, 3, 5],看起来对了,但可能漏删
# ✅ 正确写法一:遍历副本
for n in nums[:]:
if n % 2 == 0:
nums.remove(n)
# ✅ 正确写法二:列表推导式
nums = [n for n in nums if n % 2 != 0]
# ✅ 正确写法三:倒序遍历删除
for i in range(len(nums) - 1, -1, -1):
if nums[i] % 2 == 0:
del nums[i]
遍历字典时也不能改字典:
d = {"a": 1, "b": 2, "c": 3}
# ❌ RuntimeError: dictionary changed size during iteration
for k in d:
if d[k] == 2:
del d[k]
# ✅ 遍历键的副本
for k in list(d.keys()):
if d[k] == 2:
del d[k]
八、itertools 里的经典 for 工具
import itertools
# 累积
for acc in itertools.accumulate([1, 2, 3, 4]):
print(acc) # 1, 3, 6, 10
# 排列
for p in itertools.permutations([1, 2, 3], 2):
print(p) # (1,2) (1,3) (2,1) ...
# 组合
for c in itertools.combinations([1, 2, 3], 2):
print(c) # (1,2) (1,3) (2,3)
# 笛卡尔积
for pair in itertools.product([1, 2], ["a", "b"]):
print(pair) # (1,'a') (1,'b') (2,'a') (2,'b')
# 分组
data = [("A", 1), ("A", 2), ("B", 3)]
for key, group in itertools.groupby(data, key=lambda x: x[0]):
print(key, list(group))
九、reversed 和 sorted 配合 for
# 倒序遍历
for x in reversed([1, 2, 3]):
print(x) # 3, 2, 1
# 排序后遍历
for x in sorted([3, 1, 2]):
print(x) # 1, 2, 3
# 按自定义规则排序
words = ["apple", "banana", "cherry"]
for w in sorted(words, key=len):
print(w) # apple, banana, cherry
十、常见坑总结
| 坑 | 说明 | 正确做法 |
|---|---|---|
| 遍历时删列表 | 会跳过元素 | 遍历副本 nums[:] 或用推导式 |
| 遍历时改字典 | RuntimeError | 遍历 list(d.keys()) |
for i in range(len(lst)) | 不 Pythonic | 用 enumerate |
| 同时遍历两个列表用索引 | 容易越界 | 用 zip |
| 大列表用列表推导式 | 占内存 | 用生成器表达式 () |
| 嵌套循环 break 只跳一层 | 逻辑容易错 | 封装成函数用 return |
忘了 for-else 的 else 是正常结束才执行 | 容易误解 | 记住 break 会跳过 else |
十一、一句话总结
| 用法 | 写法 |
|---|---|
| 基础遍历 | for x in iterable: |
| 带索引 | for i, x in enumerate(lst): |
| 同时遍历多个 | for a, b in zip(l1, l2): |
| 遍历字典 | for k, v in d.items(): |
| 条件筛选 | [x for x in lst if 条件] |
| 省内存 | (x for x in lst) 生成器 |
| 找不到做某事 | for...else |
| 倒序 | for x in reversed(lst): |
| 排序后 | for x in sorted(lst): |
| 跳出多层 | 封装成函数用 return |
核心记住:Python 的 for 是“遍历”而不是“计数”,优先用 enumerate、zip、items()、推导式,避免用索引硬写。遍历时不要修改原容器。