4

質問:

以下のコードがあります。以下のコードにコメント行を含めるかどうかが問題にならない理由を知りたいです。

#!/usr/bin/env python

from itertools import *
import time
cc = cycle([ iter([1,2,3]), iter([4]) , iter([5,6]) ] )
p = 3
while p:
    try:
        for k in cc:
            print k.next()
    except StopIteration:
        p = p - 1
        cc = cycle(islice(cc,  p))  # this does not matter

出力:

1
4
5
2
6
3

roundrobinレシピもチェック

http://docs.python.org/2.7/library/itertools.html

このコードは、islice影響を与えていることを示していますcc

#!/usr/bin/env python

from itertools import *
import time
cc = cycle([ iter([1,2,3]), iter([4]) , iter([5,6]) ] )
p = 3
while p:
    try:
        for k in cc:
            print k,k.next()
    except StopIteration:
            print "stop iter"
            p = p - 1
            cc = cycle(islice(cc,  p)) 

出力

<listiterator object at 0x7f32bc50cfd0> 1
<listiterator object at 0x7f32bc518050> 4
<listiterator object at 0x7f32bc518090> 5
<listiterator object at 0x7f32bc50cfd0> 2
<listiterator object at 0x7f32bc518050> stop iter
<listiterator object at 0x7f32bc518090> 6
<listiterator object at 0x7f32bc50cfd0> 3
<listiterator object at 0x7f32bc518090> stop iter
<listiterator object at 0x7f32bc50cfd0> stop iter
4

2 に答える 2

4

うーん...ここで期待されていることをしているようです。

したがって、通常、サイクルは次のように機能します。

cycle([1,2,3,4,5]) -> [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]

StopIterator を取得するまで値を保存し、保存したリストから値を返し始めます。この場合、それは次のようになります[iter(a), iter(b), iter(c)]( iter(x) は、内部にあるものは何でも、リストイテレータオブジェクト自体です)。したがって、チェーンは実際には次のようなものを返します。

[iter(a), iter(b), iter(c), iter(a), iter(b), iter(c), iter(a), iter(b), iter(c), ...]

実行すると次のようになります。

[1, 4, 5, 2, StopIterator]

しかし、それは k.next() の値であり、k ではありません。cc 自体は StopIterator を返していません。それが返すオブジェクトです。

では、 を呼び出しますislice(cc,2)[iter(c), iter(a)]これらはシーケンス内の次の 2 つの項目であるため、これは sequence を返す必要があります。繰り返しますが、cc でそれらを循環させたいのですが、今は取得する必要があります。

[iter(c), iter(a), iter(c), iter(a), iter(c), iter(a), ...]

まだ大きな違いはわかりませんが、これはスライスが元の長さよりも短いためです。つまり、オリジナルは [iter(c), iter(a), iter(b), iter(c), iter(a), ...]

しかし、その違いを確認するには、2 つ以上のアイテムを使用する必要があります。

あなたはアイテムを引き離し始め、あなたは得る

[6, 3, StopIterator]

アイテムは 2 つだけなので、islice なしで入手できるアイテムは 2 つと同じです。

を実行するislice(cc, 2)と、次の 2 つの項目が得られます[iter(a), iter(c)]。これらの両方が使い果たされているので、あなたは得る

[StopIterator]

そしてあなたの正確なシーケンス。

あなたが何を期待しているのかわかりませんが、これは私が期待するとおりに機能します。

于 2013-10-02T20:11:49.523 に答える