6

であることはわかっていiteratorますがiterable、パスは 1 つだけです。

たとえば、多くの関数はパラメーターとしてitertools受け取ります。API に次のように表示されている場合は、いつでもパスできますか?iterableisliceiteratoriterable

@delnanが指摘したように:

everyiteratorは ですが、iterable(コアチーム以外の) 一部の人々は、「同じ結果で何度も反復できるもの」を意味するときに「反復可能」と言います。一部のコードは、実際には動作すると主張していますiterablesが、実際には動作しません iterators

それはまさに私の懸念です。iterableマルチパスをサポートするものの名​​前はありますか? IEnumerableC#のように?

をサポートすると主張する関数を構築する場合iterable、実際にiteratorもサポートするのがベストプラクティスですか?

4

3 に答える 3

6

はい、itertools の関数は反復子で使用するように設計されています。関数シグネチャが言う理由はiterable、リスト、タプル、およびイテレータではないその他のイテラブルでも機能するためです。


シーケンスは、特別なメソッドを介して整数インデックスを使用して効率的な要素アクセスをサポートし、シーケンスの長さを返すメソッド__getitem__()を定義するiterable です。len()

この定義は、反復子ではないすべての iterable のセットとは少し異なります。__getitem__( , メソッドを持ち、 を持たない (不自由な) カスタム クラスを定義することもできます__len__。これは、イテレータではない iterable になりますが、それも ではありませんsequence。)

ただしsequences、すべてのシーケンスは反復可能であり、複数回反復できるため、探しているものにかなり近いです。

Python に組み込まれているシーケンス タイプの例にはstrunicodelisttuplebytearraybufferおよびが含まれxrangeます。


用語集から抜粋したいくつかの定義を次に示します。

container
    Has a __contains__ method

generator
    A function which returns an iterator.

iterable
    An object with an __iter__() or __getitem__() method. Examples of
    iterables include all sequence types (such as list, str, and
    tuple) and some non-sequence types like dict and file. When an
    iterable object is passed as an argument to the builtin function
    iter(), it returns an iterator for the object. This iterator is
    good for one pass over the set of values.

iterator
    An iterable which has a next() method.  Iterators are required to
    have an __iter__() method that returns the iterator object
    itself. An iterator is good for one pass over the set of values.

sequence
    An iterable which supports efficient element access using integer
    indices via the __getitem__() special method and defines a len()
    method that returns the length of the sequence. Note that dict
    also supports __getitem__() and __len__(), but is considered a
    mapping rather than a sequence because the lookups use arbitrary
    immutable keys rather than integers.  sequences are orderable
    iterables.

    deque is a sequence, but collections.Sequence does not recognize
    deque as a sequence.
    >>> isinstance(collections.deque(), collections.Sequence)
    False
于 2013-10-28T19:55:09.377 に答える
3

はい、すべての反復子も反復可能であるためです。

__iter__()メソッドが定義されている場合、オブジェクトは反復可能です。すべての反復子にはこのメソッドがあり、反復子自体を返します。

于 2013-10-28T19:55:26.993 に答える
2

モジュールで定義されている抽象基本クラスを確認する必要がありcollectionsます。あなたの目的のために、Containerまたはそれらがそれぞれ必要とSizedするため、最も有用かもしれません。これには、繰り返し反復できる明確に定義された値のセットが必要です。__contains____len__

于 2013-10-28T20:37:29.287 に答える