Python for循环的经典用法汇总

7 阅读5分钟

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("没找到")

五、breakcontinuepass

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))

九、reversedsorted 配合 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))不 Pythonicenumerate
同时遍历两个列表用索引容易越界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 是“遍历”而不是“计数”,优先用 enumeratezipitems()、推导式,避免用索引硬写。遍历时不要修改原容器。