我一直在寻找一种编写基于生成器的 Python 迭代器的好方法。我找到了很多关于迭代器主题的教程,还有很多关于生成器和 yield 语句的教程,但没有任何东西可以将两者结合起来。我建立了一个可行的小例子,并想知道是否有更好的方法来做到这一点。
class myIterator :
def __init__(self, n) :
self.last = n
self.myGen = self.myGenerator()
def __iter__(self) :
return self.myGenerator()
def next(self) :
return self.myGen.next()
def myGenerator(self) :
prev = 0
fib = 1
while fib < self.last :
res = fib
yield res
fib = fib + prev
prev = res
raise StopIteration
我在一个真实世界的程序中使用了这种技术,该程序可以在我的 Github 存储库中的 SQLStatements.py 中找到
其中最令人困惑的部分是定义 next() 函数。显而易见的解决方案在每次调用时都返回第一个元素。存储包含生成器的实例变量是可行的,但似乎是一个杂项。
如果您知道更好的方法或涵盖此主题的好教程,请告诉我。
编辑:@MartijnPieters 发布的第三个示例完全解决了这个问题。将 self.generator.next 函数保存在 self.next 中提供了一个 next 函数。我希望这可以帮助其他人试图解决这个问题。