ZetCode

Python iter 函数

上次修改时间:2025 年 4 月 11 日

本全面指南探讨了 Python 的 iter 函数,该函数为可迭代对象返回一个迭代器对象。我们将介绍基本用法、自定义可迭代对象、哨兵值以及 Python 中迭代的实际示例。

基本定义

iter 函数为给定的可迭代对象返回一个迭代器对象。 它是 Python 的 for 循环和迭代协议背后的基本机制。

主要特点:接受一个可迭代对象(或一个可调用对象和一个哨兵值),返回一个实现 __next__ 的迭代器。 隐式用于 for 循环和推导式。

基本的可迭代对象用法

以下是不同可迭代类型的简单用法,展示了 iter 如何将集合转换为迭代器。

basic_iter.py
# 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 类。

custom_iter.py
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 函数可以接受一个可调用对象和一个哨兵值来创建一个迭代器,该迭代器在返回哨兵值时停止。

sentinel.py
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 的哨兵形式对于读取文件直到满足特定条件特别有用。

file_iter.py
# 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

errors.py
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__

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程