ジェネレーターに基づく Python イテレーターを作成する良い方法を探していました。イテレーターのトピックに関する多くのチュートリアルと、ジェネレーターと yield ステートメントに関する多くのチュートリアルを見つけましたが、2 つを組み合わせたものはありません。動作する小さな例を作成し、これを行うためのより良い方法があるかどうか疑問に思いました。
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 によって投稿された 3 番目の例は、問題を完全に解決します。self.generator.next 関数を self.next に保存すると、次の関数が提供されます。これが、この問題を解決しようとしている他の誰かに役立つことを願っています。