迭代器

Python 迭代器与可迭代对象详解

可迭代对象 (Iterable)

可迭代对象是指可以直接作用于 for 循环的对象。在 Python 中,常见的可迭代对象包括:

  • 集合数据类型:list, tuple, dict, set, str
  • 生成器 (generator) 和带有 yield 的生成器函数

检查可迭代性

可以使用 isinstance()collections.abc.Iterable 来判断一个对象是否是可迭代的:

from collections.abc import Iterable

print(isinstance([], Iterable))        # True
print(isinstance({}, Iterable))        # True
print(isinstance('abc', Iterable))     # True
print(isinstance((x for x in range(10)), Iterable))  # True
print(isinstance(100, Iterable))       # False

迭代器 (Iterator)

迭代器是更特殊的可迭代对象,它不仅可以用在 for 循环中,还可以被 next() 函数不断调用并返回下一个值,直到抛出 StopIteration 异常。

检查迭代器

可以使用 isinstance()collections.abc.Iterator 来判断:

from collections.abc import Iterator

print(isinstance((x for x in range(10)), Iterator))  # True
print(isinstance([], Iterator))        # False
print(isinstance({}, Iterator))        # False
print(isinstance('abc', Iterator))     # False

将可迭代对象转为迭代器

可以使用 iter() 函数将可迭代对象转为迭代器:

print(isinstance(iter([]), Iterator))   # True
print(isinstance(iter('abc'), Iterator))  # True

迭代器与可迭代对象的区别

  1. 数据流特性:迭代器表示一个数据流,可以惰性计算,不需要预先知道序列长度
  2. 无限序列:迭代器可以表示无限序列(如全体自然数),而列表等集合类型不能
  3. 内存效率:迭代器一次只产生一个元素,内存效率更高

for 循环的实现原理

Python 的 for 循环本质上是通过迭代器实现的。例如:

for x in [1, 2, 3, 4, 5]:
    pass

等价于:

# 获取迭代器对象
it = iter([1, 2, 3, 4, 5])

# 循环
while True:
    try:
        # 获取下一个值
        x = next(it)
    except StopIteration:
        # 遇到StopIteration退出循环
        break

实际应用建议

  1. 处理大数据集:使用迭代器可以节省内存
  2. 自定义迭代器:实现 __iter__()__next__() 方法
  3. 生成器表达式:比列表推导式更节省内存
# 列表推导式 - 立即计算所有元素
squares_list = [x*x for x in range(1000)]

# 生成器表达式 - 惰性计算
squares_gen = (x*x for x in range(1000))

总结

特性IterableIterator
可用于for循环
可用于next()
惰性计算
表示无限序列
示例list, dict, str生成器, iter()结果

理解迭代器和可迭代对象的区别对于编写高效、Pythonic的代码非常重要,特别是在处理大型数据集或需要惰性计算的场景中。