题:
我有下面的代码.我想知道为什么我是否在下面的代码中包含注释行.
#!/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
#!/usr/bin/env python from itertools import * import time cc = cycle([ iter([1,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,3,4,5]) -> [1,5,1,5]
它将存储值,直到它获得StopIterator,然后它将开始从其保存的列表返回值.在这种情况下,那将是[iter(a),iter(b),iter(c)](其中iter(x)是一个listiterator对象本身,跨越任何内部).因此,链实际上会返回这样的东西:
[iter(a),iter(c),iter(a),...]
运行它时看起来像什么:
[1,StopIterator]
但这是k.next()的值,而不是k. cc本身没有返回StopIterator,它返回的对象是.
现在,你打电话给islice(cc,2).这应该返回序列[iter(c),iter(a)],因为它们是序列中的下两个项目.再一次,你想让cc循环它们,但现在你应该得到它
[iter(c),...]
你不会注意到很多差异,但那是因为你的切片小于原始切片的长度.换句话说,原件就会消失
[iter(c),…]
但你必须走得比两个项目更远才能看到这种差异,并……
你开始拉掉物品就可以了
[6,StopIterator]
只有两个项目,所以它们是你在没有islice的情况下得到的两个项目.
现在,当您执行islice(cc,2)时,您将获得接下来的两个项目[iter(a),iter(c)].这两个都用尽了,所以你得到了
[StopIterator]
和你的确切顺序.
我不知道你在期待什么,但这完全符合我的预期.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。