リストオブジェクトとisliceオブジェクトの両方が反復可能ですが、なぜこの結果が異なるのでしょうか。ここitertoolsライブラリのtee関数
r = [1, 2, 3, 4]
i1, i2 = tee(r)
print [e for e in r if e < 3]
print [e for e in i2]
#[1, 2]
#[1, 2, 3, 4]
r = islice(count(), 1, 5)
i1, i2 = tee(r)
print [e for e in r if e < 3]
print [e for e in i2]
#[1, 2]
#[]
リストオブジェクトとisliceオブジェクトは同様に動作する必要がありますか? – John
@Johnいいえ、リストをループすると、毎回新しいイテレーターが得られます。つまり、値を取得することができます。 'islice()'を使うとジェネレータが得られます。ジェネレータは一度値を生成してから使い果たします。それを自分で試してみてください。リストを2回ループし、isliceを使ってループを2回繰り返します。動作の違いに注意してください。 –
@ John 2つの例を同様に動作させるには、 'r = [1,2,3,4]'ではなく 'r = iter([1,2,3,4])'を使います。 – clacke