2

オブジェクトが添字可能になったのに、rangeオブジェクトが添字可能でないのはなぜitertools.repeatですか?

In [10]: range(3, 10)[3]
Out[10]: 6

In [11]: import itertools as it

In [12]: it.repeat(5)[3]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-1ef74480e0a7> in <module>()
----> 1 it.repeat(5)[3]

TypeError: 'itertools.repeat' object is not subscriptable

range オブジェクトと itertools.repeat オブジェクトは Python 3 の一部であることに注意してください。

を好む:

class repeat_(itertools.repeat):
    def __init__(self, object_, times=None):
        super().__init__(object_, times)

        self.object_ = object_
        self.times = times

    def __reversed__(self):
        return self

    def __getitem__(self, key):
        return self.object_

    def __contains__(self, key):
        return key == self.object_

    def __len__(self):
        if self.times is None:
            raise ValueError
        return self.times
4

2 に答える 2

4

repeat同じオブジェクトを何度も生成するだけです。それが実際にあなたのために何をするのか、私にはよくわかりません...あなたはnext(repeat_object). おそらくあなたは考えていcycleますか(最初にあなたの質問を読んだときのように)?

驚くべきことの一部は、itertools可能な限り怠惰に動作しようとすることです。これを踏まえて、ジェネレータ式を に渡すとどうなると思いますitertools.cycleか? 全体をタプルにキャストして問い合わせる以外に、渡したオブジェクトの長さを知る方法はありませcycleこれを行うと、他の多くの場所で API が壊れる可能性があります (繰り返しオブジェクトを添字付けするときにイテラブルを消費するようになりました)。または、不要なものを介してさらに多くの中間ストレージが必要になります。itertools.teeこれはitertools回避しようとするものです。現在実施されているので、cycleメモリ内に保持することを望むことができない巨大なジェネレーター式では (実際にすべての要素を反復処理しない限り)、大きなインデックスで添字を付けようとした場合は当てはまりません。 .

最後に、名前が示すように、オブジェクトitertoolsを作成するためのライブラリです。iterableそのため、オブジェクトが添字可能であると期待する理由はありません。(結局呼び出されませんsubscripttools:)。

補足として、 でやりたいことができるかもしれませんitertools.islice

于 2012-11-23T16:32:48.770 に答える
0

itertool.repeat()メソッドは、range関数の場合と同様に、リストではなく反復子を返します。したがって、それに添字を付けることはできません。

ドキュメントの内容は次のとおりです。 -

オブジェクトを何度も返すイテレータを作成します。times 引数が指定されない限り、無期限に実行されます。

範囲のドキュメントから: -

一連の数値を繰り返し処理する必要がある場合は、組み込み関数 range() が便利です。算術級数を含むリストを生成します


Python 3の違いは、オブジェクトrange()を作成するGeneratorことです。Python 2のどのxrange関数が実行したか。

于 2012-11-23T16:22:01.753 に答える