作者:张大鹏
发布时间:2025-10-30
标签:Python、循环、迭代器、性能优化


一、前言

循环是所有编程语言中最基础、最常用的控制结构之一。
而在 Python 中,for 循环以其简洁、强大且高度可扩展的特性,成为迭代数据结构的首选工具。

本文将从 语法原理、使用技巧、底层机制与性能优化 四个方面,系统讲解 Python 的 for 循环。


二、for 循环的基本语法

Python 的 for 循环语法如下:

for variable in iterable:
    # 循环体
else:
    # 可选的 else 子句

解释:

  • iterable:可迭代对象(如列表、元组、字符串、字典、集合、生成器等)
  • variable:每次循环取出的元素
  • else:循环正常结束(非 break 中断)后执行的代码块

示例:

numbers = [1, 2, 3, 4, 5]
for n in numbers:
    print(n)
else:
    print("循环正常结束")

输出:

1
2
3
4
5
循环正常结束

注意:else 块不会在 break 触发时执行。


三、可迭代对象与迭代器的关系

要理解 for 循环的本质,就必须理解 Python 的 迭代协议

Python 中,for 循环的本质是:

iterator = iter(iterable)
while True:
    try:
        item = next(iterator)
    except StopIteration:
        break
    # 执行循环体

也就是说:

  • for 并不是简单的“遍历列表”,而是通过 迭代器(iterator)协议 获取元素。
  • 任何实现了 __iter__() 方法的对象,都是 可迭代对象(iterable)
  • 迭代器对象还需要实现 __next__() 方法。

示例:

class MyRange:
    def __init__(self, start, end):
        self.current = start
        self.end = end
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current >= self.end:
            raise StopIteration
        val = self.current
        self.current += 1
        return val

for i in MyRange(1, 5):
    print(i)

输出:

1
2
3
4

这正是 for 循环的底层运行机制。


四、循环中的常见高级用法

1. 同时遍历多个序列:zip()

names = ['Alice', 'Bob', 'Charlie']
scores = [85, 90, 78]

for name, score in zip(names, scores):
    print(f"{name}: {score}")

2. 获取索引:enumerate()

for index, value in enumerate(['a', 'b', 'c']):
    print(index, value)

3. 字典遍历:items()keys()values()

data = {'name': 'Alice', 'age': 25}
for key, value in data.items():
    print(key, value)

4. 列表推导式(List Comprehension)

这是 for 的一个高阶应用:

squares = [x**2 for x in range(1, 6)]
print(squares)

等价于:

squares = []
for x in range(1, 6):
    squares.append(x**2)

五、循环控制语句

语句 作用
break 终止整个循环
continue 跳过当前迭代,继续下一个
pass 占位符,无实际作用
else 循环正常结束后执行

示例:

for i in range(5):
    if i == 3:
        break
    print(i)
else:
    print("循环正常结束")

输出:

0
1
2

(不会执行 else


六、性能分析与优化

1. 优化一:尽量使用生成器

使用生成器表达式代替列表推导式,可以节省内存:

# 使用生成器(惰性计算)
squares = (x**2 for x in range(10**6))

生成器不会一次性生成所有数据,而是“按需计算”。

2. 优化二:避免在循环中修改容器

错误示例:

nums = [1, 2, 3, 4]
for n in nums:
    nums.remove(n)  # 修改正在迭代的对象

正确做法:

nums = [1, 2, 3, 4]
for n in nums[:]:  # 迭代副本
    nums.remove(n)

3. 优化三:使用内置函数替代循环

内置函数如 sum()max()any()all() 等通常用 C 实现,效率更高。

# 推荐
total = sum(range(1000000))

# 不推荐
total = 0
for i in range(1000000):
    total += i

七、结语

Python 的 for 循环不仅语法简洁,还能灵活结合 迭代器、生成器、推导式 等特性,实现从高效遍历到优雅数据流的全方位控制。

理解 for 循环的底层逻辑,不仅有助于写出更 Pythonic 的代码,更能在数据处理与性能优化中游刃有余。

Logo

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

更多推荐