相同点:
- 都是可迭代对象
- 都是惰性生成的,对于大量有序数据的迭代处理,可以有效减少内存占用
不同点:
- 声明方式不同:
生成器的声明一般类似于函数,只是包含yield
关键字,Python中除此之外还有一种更简洁的类似列表生成式的方式。
迭代器的声明一般是类的声明,且需要包含特定函数 / 继承特定Iterator类 / 实现特定Iterator接口。 - 适用场合不同:
生成器一般只是为了应对大数据量迭代的内存消耗问题,迭代本身的逻辑可能并不复杂。而迭代器适用于更加复杂的场景。
# 用生成器实现斐波那契数列
def fib(n):
i, pre, cur = 0, 0, 1
while i < n:
yield cur
pre, cur = cur, pre + cur
i += 1
for x in fib(10):
print(x)
PHP官方文档关于迭代器类的调用逻辑讲的很清楚:http://php.net/manual/zh/class.iterator.php