Python iter 函数
上次修改时间:2025 年 4 月 11 日
本全面指南探讨了 Python 的 iter
函数,该函数为可迭代对象返回一个迭代器对象。我们将介绍基本用法、自定义可迭代对象、哨兵值以及 Python 中迭代的实际示例。
基本定义
iter
函数为给定的可迭代对象返回一个迭代器对象。 它是 Python 的 for 循环和迭代协议背后的基本机制。
主要特点:接受一个可迭代对象(或一个可调用对象和一个哨兵值),返回一个实现 __next__
的迭代器。 隐式用于 for 循环和推导式。
基本的可迭代对象用法
以下是不同可迭代类型的简单用法,展示了 iter
如何将集合转换为迭代器。
# With lists numbers = [1, 2, 3] num_iter = iter(numbers) print(next(num_iter)) # 1 print(next(num_iter)) # 2 # With strings text = "hello" char_iter = iter(text) print(next(char_iter)) # 'h' print(next(char_iter)) # 'e'
此示例展示了 iter
与不同可迭代类型的使用。 对于列表,它创建一个按顺序产生元素的迭代器。 对于字符串,它逐个产生字符。
next
函数用于手动前进迭代器。 这是 Python 在 for 循环内部执行的操作。
自定义可迭代对象
您可以通过实现迭代器协议来使自定义对象可迭代。 此示例创建了一个 Countdown 类。
class Countdown: def __init__(self, start): self.start = start def __iter__(self): return self def __next__(self): if self.start <= 0: raise StopIteration current = self.start self.start -= 1 return current countdown = Countdown(3) countdown_iter = iter(countdown) print(next(countdown_iter)) # 3 print(next(countdown_iter)) # 2 print(next(countdown_iter)) # 1
Countdown 类实现了 __iter__
和 __next__
方法。 当我们在其上调用 iter
时,Python 使用这些方法。
当您需要超出内置类型提供的自定义迭代行为时,此模式很常见。
使用哨兵值
iter
函数可以接受一个可调用对象和一个哨兵值来创建一个迭代器,该迭代器在返回哨兵值时停止。
import random def random_until_5(): num = random.randint(1, 10) print(f"Generated: {num}") return num five_iter = iter(random_until_5, 5) for num in five_iter: print(f"Got: {num}")
这将创建一个迭代器,该迭代器重复调用 random_until_5
,直到它返回 5。 生成的每个数字都会被打印,直到出现哨兵值。
这对于从函数创建迭代器很有用,这些函数会生成值直到满足终止条件。
使用 iter 读取文件
iter
的哨兵形式对于读取文件直到满足特定条件特别有用。
# Read lines until empty line with open('data.txt') as f: for line in iter(f.readline, '\n'): print(line.strip()) # Read fixed-size chunks with open('large_file.bin', 'rb') as f: for chunk in iter(lambda: f.read(1024), b''): process(chunk)
第一个示例读取行,直到遇到空行。 第二个示例以块的形式读取二进制数据,直到 EOF。
这演示了 iter
如何为处理大型文件创建内存高效的迭代器,而无需将所有内容加载到内存中。
错误处理
当与不可迭代对象或无效的参数组合一起使用时,iter
函数会引发 TypeError
。
try: print(iter(42)) except TypeError as e: print(f"Error: {e}") # 'int' object is not iterable try: print(iter(lambda: 1, 2, 3)) # Too many arguments except TypeError as e: print(f"Error: {e}") # iter() takes at most 2 arguments (3 given)
这些示例演示了 iter
在使用无效输入时的行为。 数字不可迭代,并且 iter
最多接受两个参数。
要使一个类与 iter
一起工作,请如前面的示例所示实现 __iter__
或 __getitem__
。
最佳实践
- 优先使用 for 循环: 尽可能使用直接迭代
- 实现协议: 对于自定义可迭代对象,请遵循协议
- 使用哨兵形式: 对于基于函数的迭代模式
- 处理 StopIteration: 在手动迭代时捕获它
- 记录行为: 清楚地记录迭代行为
资料来源
作者
列出所有 Python 教程。