在Python中,迭代器是实现了迭代器协议的对象:__iter__()和__next__()方法。迭代器管理其内部状态,并在每次调用next()时返回序列的下一个元素,或者在结束时抛出StopIteration异常。
可迭代对象是可以在循环中遍历的对象(例如列表、字符串、字典)。它们都有一个返回迭代器的__iter__()方法。
要实现自定义迭代器,需要创建一个类,包含__iter__()(返回self)和__next__()(实现获取下一个元素的逻辑)两个方法:
class Counter: 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 for num in Counter(1, 3): print(num) # 1 2 3
可迭代对象与迭代器有什么区别?可以对迭代器进行多次迭代吗?
答案: 可迭代对象仅实现了返回迭代器的__iter__()方法。迭代器是具有__next__()方法的对象。迭代器通常只能迭代一次:到达序列的末尾后,无法重复迭代而不创建新的迭代器。
故事
在一个日志分析项目中,开发人员写了一个接受迭代器的函数,并尝试两次遍历它(
for log in logs:),期望两次遍历都能得到相同的结果。第二次迭代没有返回任何内容,因为迭代器已经被“消耗”掉了。
故事
在一个模块中,开发人员从函数中返回了一个生成器而不是列表,生成器只允许单次迭代。在试图将其传递给另一个期望可迭代对象以进行多次遍历的函数时,发生了意外错误和空结果。
故事
在Web API项目中,开发人员试图直接将迭代器序列化为JSON。迭代器不是列表,无法在不先转换为列表的情况下进行转换(否则序列化将抛出异常)。