在 Python 中,for 循环看起来非常简单:

for 变量 in 可迭代对象:
    循环体

然而,这种单一的语法形式却可以演化出十几种不同的使用模式。很多从 C、Java 转过来的初学者会问:为什么 Python 没有 for(i=0; i<10; i++) 这种三段式循环? 本文将从 Python 的设计哲学出发,系统梳理 for 循环的多种“形态”,并与传统语言的循环风格做对比,帮助你彻底理解 Python 迭代之美。

一、只有一种语法,但能模拟一切

首先明确:Python 的 for 循环只有 for ... in ... : 这一种语法形式。它不像 C/Java 那样提供独立的计数型循环语句。

但通过配合不同的可迭代对象或内置函数,它能实现的功能远超传统 for 循环。例如,要实现经典的“从 0 到 9 循环”:

Java 风格:

for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

Python 风格:

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

range() 函数生成了一个惰性序列(可迭代对象),完美替代了初始化、条件和步进三段式。如果要指定步长:

for i in range(0, 10, 2):   # 0, 2, 4, 6, 8
    print(i)

如果需要更灵活地控制循环变量(例如在循环体中动态修改步长),可以退而使用 while 循环:

i = 0
while i < 10:
    print(i)
    if some_condition:
        i += 3
    else:
        i += 1

二、为什么 Python 不提供三段式 for?

Python 的设计哲学强调简洁迭代协议。在 Python 看来,for 循环本质上是“迭代器循环”——逐个访问可迭代对象中的元素。数值区间只是可迭代对象的一种特例,专门为它设计一套三段式语法会破坏语言的一致性,也容易引入经典的“差一错误”(off-by-one)和循环变量被意外修改的问题。

此外,统一使用 for ... in ... 使得任何实现了 __iter____getitem__ 的对象都能直接被 for 消费,大大增强了代码的复用性和可读性。

三、常见 for 循环形式一览

下面列举了 Python 中 for 循环的 11 种典型写法,掌握它们可以应对绝大多数迭代场景。

1. 直接迭代序列(字符串、列表、元组)

for ch in "hello":
    print(ch)

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

for tup in (1, 2, 3):
    print(tup)

2. 使用 range() 进行数值循环

for i in range(5):         # 0,1,2,3,4
for i in range(5, 10):     # 5,6,7,8,9
for i in range(0, 10, 2):  # 0,2,4,6,8

常用于按索引遍历列表:

for i in range(len(lst)):
    print(i, lst[i])

3. 使用 enumerate() 同时获取索引和元素

for idx, value in enumerate(['a', 'b', 'c']):
    print(idx, value)
# 输出:
# 0 a
# 1 b
# 2 c

4. 使用 zip() 并行遍历多个可迭代对象

names = ['Tom', 'Jerry', 'Spike']
ages = [20, 21, 22]
for name, age in zip(names, ages):
    print(f"{name} is {age} years old")

zip 默认以最短对象为准,如需对齐最长对象可使用 itertools.zip_longest

5. 遍历字典的键、值、键值对

d = {'a': 1, 'b': 2}
for key in d:               # 等价于 d.keys()
for value in d.values():
for k, v in d.items():

6. 使用 sorted()reversed() 控制迭代顺序

for item in sorted([3,1,2]):      # 1,2,3
for item in reversed([1,2,3]):    # 3,2,1

7. 自动解包迭代元素

当可迭代对象中的元素本身也是可解包结构时,可以直接在 for 语句中解包:

points = [(1,2), (3,4), (5,6)]
for x, y in points:
    print(f"x={x}, y={y}")

8. 嵌套 for 循环

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

9. for-else 结构

else 子句在循环正常结束(即没有遇到 break)时执行:

for x in range(5):
    if x == 10:
        break
else:
    print("循环没有被 break 中断")   # 会执行

常用于查找场景,例如判断素数。

10. 在循环中使用 breakcontinue

for i in range(10):
    if i % 2 == 0:
        continue      # 跳过偶数
    if i > 7:
        break         # 终止循环
    print(i)          # 输出 1,3,5,7

11. 推导式(虽然不是语句,但语法与 for 紧密相关)

列表、字典、集合推导式可以看作 for 循环的表达式版本:

squares = [x**2 for x in range(10)]
even_squares = {x: x**2 for x in range(5) if x % 2 == 0}

四、总结

角度 说明
语法形式 只有一种:for 变量 in 可迭代对象:
设计理念 基于迭代器协议,统一且安全
能力范围 通过 rangeenumeratezip、字典视图、解包等实现所有迭代需求
与传统语言对比 不直接提供 for(i;cond;step),但能用 range() 完全模拟,且更不易出错

Python 的 for 循环之所以强大,不是因为它提供了更多关键字,而是因为它建立在一个优雅的抽象——“迭代”之上。当你习惯了这种风格,你会发现自己写出的循环代码更短、更清晰、更少出现索引越界的 bug。下一次当你怀念 C 风格的三段式循环时,请记住:for i in range(...) 就是你的答案,而 for item in iterable 才是 Python 的灵魂。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐