1. 定义方式:迭代器是实现了 `__iter__()` 和 `__next__()` 方法的对象。你需要定义一个类,然后在类中实现这两个方法来创建一个迭代器。而生成器则是使用 `yield` 语句的函数。当函数被调用时,它返回一个生成器对象,而不是立即执行函数。
2. 生产数据的方式:迭代器在每次调用 `next()` 时返回一个值,当没有更多的元素可返回时,它将引发 `StopIteration` 异常。生成器也在每次调用 `next()` 时返回一个值,但是当没有更多的元素可返回时,它不会引发 `StopIteration` 异常,而是自动停止。
3. 内存使用:迭代器和生成器都是懒加载的,只有在需要时才会生成值。这意味着它们都可以处理大量数据,而不会耗尽内存。但是,生成器更进一步,它们不需要在内存中存储所有的值,而是在运行时生成值。这使得生成器在处理大型数据流时更加高效。
4. 可迭代次数:一般来说,你可以多次遍历一个迭代器。但是,生成器只能遍历一次。这是因为生成器并不把所有的值放在内存中,而是在运行时生成值 下面是一些例子。
迭代器的例子:
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 number in Counter(3, 8):
print(number)
一个生成器的例子:
def counter(low, high):
while low <= high:
yield low
low += 1
for number in counter(3, 8):
print(number)