イテレータを使用して生成された数値のシーケンスに特定の値が属するかどうかをテストしたいと思います。もちろん、の値がの場合、その値が満たされるとすぐに停止することができます。しかし、にが入っていないときは、それが問題だと思います。イテレータによって値が生成されないかどうかをテストする
しかし、追加情報を使用することができます(たとえば、シーケンスが増加しているなど)。
フィボナッチ例考えてみましょう:8
はシーケンスに属しているかどうかを1つのテストはその後、すべてがうまくている場合
class FibonacciIterator(object):
def __init__(self):
self.mem = [0, 1]
def __next__(self):
curr = self.mem[0]
new = self.mem[0]+self.mem[1]
self.mem[0] = self.mem[1]
self.mem[1] = new
return curr
class Fibonacci(object):
def __iter__(self):
return FibonacciIterator()
を:
>>> fib = Fibonacci()
>>> 8 in fib
True
しかし、1が属していない10
を(テストし、場合シーケンスに)
決してt erminates。しかし、8
が13
となった後、そして配列が必然的に増加しているので、not 10 in fib
があることを観察することによって、10
が配列中にないことを容易に判定することができる。
in
のような振る舞いを実装するための良い方法がPythonにあるので、10 in fib
は終了しますか?
あなたは順序が単調に増加していることを知っている '__contains__'の定義を提供することができます。しかし、ジェネレータの場合、 '__contains__'はシーケンスを消費する*ので、特に有用ではありません。 – chepner
は、天気をテストしていない場所で問題が発生している可能性があります。数値が入力を超過しました。 – VIPER
@chepner実際には、イテレータが消費されるという事実は、上記の例では大したことではありません。 '__contains__' 'in'が使用されるたびに新しい' FibonacciIterator'( "iterator")を生成する 'Fibonacci'クラス(" iterable ") –