在Python中,迭代器(Iterator)和可迭代对象(Iterable)是两个密切相关的概念,它们在处理序列和其他集合时扮演着重要角色。理解它们之间的区别和联系对于编写高效、Pythonic的代码至关重要。
可迭代对象(Iterable)
可迭代对象是指那些可以返回一个迭代器的对象。在Python中,这意味着对象需要实现__iter__()
方法,该方法返回一个迭代器。几乎所有的集合类型(如列表、元组、字典、集合、字符串等)都是可迭代对象。此外,任何实现了__iter__()
方法的对象也可以被视为可迭代对象。
当你对一个可迭代对象使用iter()
函数时,它会调用该对象的__iter__()
方法,并返回一个迭代器。
迭代器(Iterator)
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:__iter__()
和__next__()
。
__iter__()
:返回迭代器对象本身。__next__()
:返回容器中的下一个元素,并将内部指针移动到下一个位置。如果所有元素都被访问,则抛出StopIteration
异常。
Python的for
循环会自动调用迭代器的__next__()
方法,并在捕获到StopIteration
异常时停止循环。
关系
- 可迭代对象通过
__iter__()
方法返回一个迭代器。这意味着,每当你需要迭代一个可迭代对象时,你实际上是在使用由该对象的__iter__()
方法返回的迭代器。 - 迭代器实现了
__iter__()
和__next__()
方法。__iter__()
方法返回迭代器对象本身,而__next__()
方法用于逐个访问集合中的元素。 - 可迭代对象不是迭代器,但可以通过调用其
__iter__()
方法获得一个迭代器。
示例
python复制代码
# 定义一个可迭代对象 | |
class Count: | |
def __init__(self, low, high): | |
self.current = low | |
self.high = high | |
def __iter__(self): | |
return self # 返回迭代器对象本身 | |
def __next__(self): | |
if self.current > self.high: | |
raise StopIteration | |
else: | |
self.current += 1 | |
return self.current - 1 | |
# 使用可迭代对象 | |
count = Count(1, 3) | |
for num in count: | |
print(num) # 输出: 1 2 3 |
在这个例子中,Count
类既是一个可迭代对象(因为它实现了__iter__()
方法),也是一个迭代器(因为它还实现了__next__()
方法)。但通常,我们会在不同的类中分别实现这两个接口,以提高代码的模块化和可重用性。