python itertools:使用islice循环

题:

我有下面的代码.我想知道为什么我是否在下面的代码中包含注释行.

#!/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

还要检查圆形食谱

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

最佳答案 嗯……看起来它正在做这里所期待的事情.

所以,通常,循环的工作方式如下:

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)是一个listiterator对象本身,跨越任何内部).因此,链实际上会返回这样的东西:

[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)],因为它们是序列中的下两个项目.再一次,你想让cc循环它们,但现在你应该得到它

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

你不会注意到很多差异,但那是因为你的切片小于原始切片的长度.换句话说,原件就会消失
    [iter(c),iter(a),iter(b),iter(c),iter(a),…]

但你必须走得比两个项目更远才能看到这种差异,并……

你开始拉掉物品就可以了

[6, 3, StopIterator]

只有两个项目,所以它们是你在没有islice的情况下得到的两个项目.

现在,当您执行islice(cc,2)时,您将获得接下来的两个项目[iter(a),iter(c)].这两个都用尽了,所以你得到了

[StopIterator]

和你的确切顺序.

我不知道你在期待什么,但这完全符合我的预期.

点赞