次の python コードは、3 の倍数と 7 の倍数をすべて組み合わせた予想されるタプルのリストではなく、[(0, 0), (0, 7)...(0, 693)] を生成します。
multiples_of_3 = (i*3 for i in range(100))
multiples_of_7 = (i*7 for i in range(100))
list((i,j) for i in multiples_of_3 for j in multiples_of_7)
このコードは問題を修正します:
list((i,j) for i in (i*3 for i in range(100)) for j in (i*7 for i in range(100)))
質問:
- ジェネレーター オブジェクトは、生成されたリストが列挙されるたびにイテレーター オブジェクトを提供するのではなく、イテレーターの役割を果たしているようです。後者の戦略は、.Net LINQ クエリ オブジェクトによって採用されているようです。これを回避するエレガントな方法はありますか?
- 2 番目のコードが機能するのはなぜですか? 7 の倍数をすべてループした後、ジェネレーターのイテレーターがリセットされないことを理解できますか?
- この振る舞いは矛盾していないとしても直感に反すると思いませんか?