Tags: 数据类型 AI 人工智能

Python迭代器(Iterators)入门指南

Python中,迭代器是一种可以逐个返回序列中元素的对象。它能够让我们使用如for循环或next()函数一项项地遍历数据,而无需一次性加载所有数据。本文将讲解什么是迭代器、可迭代对象,并展示如何自定义一个迭代器类。

1. 迭代器 vs. 可迭代对象

像列表、元组、字典、集合、字符串等,这些都属于可迭代对象(Iterable)。可迭代对象含有一个__iter__()方法(或实现了类似协议),我们可以通过iter()函数获取到它的迭代器。

fruits = ["apple", "banana", "cherry"]
myit = iter(fruits)
print(next(myit))  # apple
print(next(myit))  # banana
print(next(myit))  # cherry

这里myit就是一个迭代器(Iterator),每次调用next(myit)返回一个元素,直到没有元素可返回时会抛出StopIteration异常。

2. for循环与可迭代对象

当我们写for x in fruits:时,实质上是for循环在背后调用iter(fruits)生成迭代器,再不断用next()取值,因此你可以遍历列表、字符串或其他可迭代对象。

for x in "banana":
    print(x)

3. 自定义迭代器

如果想让某个类的对象具备“可以一项一项返回数据”的能力,只需在类中定义__iter__()__next__()方法。

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
    def __next__(self):
        x = self.a
        self.a += 1
        return x
myclass = MyNumbers()
myit = iter(myclass)
print(next(myit))  # 1
print(next(myit))  # 2
print(next(myit))  # 3

以上示例中,__iter__()在对象初始化后返回自身(self),__next__()则定义了每次取值返回什么。这样就构成了一个最基本的迭代器。

4. 防止无限循环:StopIteration

如果不加控制,__next__()方法就会一直返回新的值,造成无限循环。通常我们会在__next__()里设置终止条件,超过范围后用raise StopIteration主动抛出异常,告诉Python “迭代结束”。

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
    def __next__(self):
        if self.a <= 5:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration
myclass = MyNumbers()
for num in myclass:
    print(num)
    
# 输出:
# 1
# 2
# 3
# 4
# 5

5. 总结

  • 可迭代对象(Iterable):如列表、元组、集合、字符串等,都可以被for循环遍历。
  • 迭代器(Iterator):实现__iter__()__next__()方法,可逐个返回元素。
  • for循环实质上会自动调用迭代器的next(),直至StopIteration
  • 自定义迭代器:为自己的类添加__iter__()__next__(),并在合适时raise StopIteration

了解并使用迭代器,可在处理大量数据或需要懒加载(lazy loading)时提高效率,也能让自定义对象像序列那样被遍历,带来更多灵活性。