Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

For (循环)

1. 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()

2. for 的基本语法

for item in iterable:
    ...

例子:

for i in [1, 2, 3]:
    print(i)

3. for + range(最常见)

for i in range(5):
    print(i)

range 也是一个惰性对象(不会一次性产生列表)。

4. for 迭代字典

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

5. for + enumerate(带索引遍历)

for idx, value in enumerate(items):
    print(idx, value)

带起始值:

enumerate(items, start=1)

6. for + zip(并行遍历)

for a, b in zip(list1, list2):
    print(a, b)

7. for + else(最常被误解)

else 在循环 正常结束(不是 break)时执行。

例子:

for x in items:
    if x == target:
        print("found")
        break
else:
    print("not found")

用途:搜索逻辑。

8. for 处理生成器

生成器惰性产出数据:

def gen():
    for i in range(3):
        yield i

for x in gen():
    print(x)

9. for 处理迭代器

迭代器只能遍历一次:

it = iter([1,2,3])
for x in it:
    print(x)

# 再遍历 -> 没有数据了
for x in it:
    print(x)  # 不打印

10. for 与列表推导式(语法糖)

result = [x*x for x in range(10)]

等价于:

result = []
for x in range(10):
    result.append(x*x)

11. for 与集合 / 字典推导式

集合推导:

s = {x*x for x in range(10)}

字典推导:

d = {x: x*x for x in range(10)}

12. for 与 break/continue

for x in items:
    if x < 0:
        continue
    if x == 0:
        break

13. for 常见高阶用法

13.1 解包遍历

pairs = [(1,2),(3,4)]
for a, b in pairs:
    print(a, b)

13.2 多重循环

for i in range(3):
    for j in range(2):
        print(i, j)

14. for 与 iter(func, sentinel) 高级技巧

for chunk in iter(lambda: f.read(1024), b''):
    process(chunk)

作用:持续读取直到遇到某个“终止符”。

非常用于文件流。

15. for 的性能最佳实践

15.1 尽量使用局部变量

Python 访问局部变量最快。

15.2 避免每轮添加属性查找

慢:

for x in data:
    result.append(x)

快:

append = result.append
for x in data:
    append(x)

15.3 避免 for + 大列表 -> 用生成器

生成器不会占用内存,提升性能。

15.4 避免循环内部大量计算,尽量提前计算

16. for 可迭代对象清单

  • list / tuple / set / dict
  • file 句柄
  • str
  • range
  • generator / yield
  • zip / map / filter / enumerate
  • 自定义实现 __iter__

17. 自定义可迭代对象

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)

18. for 的常见坑

18.1 修改正在遍历的 list(危险)

错误:

for x in items:
    items.remove(x)

正确:

for x in items[:]:
    items.remove(x)

或:

items = [x for x in items if ...]

18.2 遍历 dict 时不能修改 dict

18.3 for 遍历迭代器只能一次

19. for 的应用场景

  • 遍历数据结构
  • 读取大文件
  • 数据流处理
  • 消费队列(如 Redis / Kafka)
  • 实现生成器算法
  • 数据过滤、变换

📌 总结(最核心 10 条)

  1. for 是对迭代器协议的语法糖。
  2. 支持所有“可迭代对象”。
  3. range 是惰性的,不会一次性生成列表。
  4. for…else 仅在循环正常结束时执行。
  5. enumerate 用于需要下标的遍历。
  6. zip 支持并行遍历。
  7. 列表推导式 = 快速 for + append。
  8. 迭代器只能遍历一次。
  9. iter(func, sentinel) 是很强大的高级技巧。
  10. 避免在遍历中修改原始列表或字典。

for else

以下是 最清晰、最经典的 Python for ... else 示例。

✅ 示例 1:查找元素 —— 如果没找到才执行 else

numbers = [1, 3, 5, 7, 9]

target = 4

for n in numbers:
    if n == target:
        print("找到了!")
        break
else:
    print("没找到目标数字")

执行结果:

没找到目标数字

🔍 原因:

  • for 遍历 正常结束,没有触发 break
  • 所以执行 else

✅ 示例 2:查找元素 —— 找到了就 break,else 不执行

numbers = [1, 3, 4, 5, 7]

target = 4

for n in numbers:
    if n == target:
        print("找到了!")
        break
else:
    print("没找到目标数字")

输出:

找到了!

🔍 原因:

  • 遇到 break -> 直接跳出循环
  • 不执行 else

✅ 示例 3:用于判断是否包含某种情况

s = "hello world"

for ch in s:
    if ch.isdigit():
        print("包含数字")
        break
else:
    print("不包含数字")

输出:

不包含数字

✅ 示例 4:优化判定 prime(素数)逻辑

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