跳回python迭代器

时间:2018-04-13 14:47:20

标签: python python-3.x for-loop

做这样的C代码

的最有效方法是什么
for(int i = 0; i < 10; i++) {
    printf("%d\n", i);
    if(i == 5)
        i = 1;
}
在python中

,所以输出将是

0
1
2
3
4
5
1
2
3
4
5
1

我知道next()

的范围
iterator = iter(range(0, 10))
for i in iterator:
    next(iterator)
    print(i)

所以这段代码会打印每一个数字,但我不知道如何跳回来进行循环。

4 个答案:

答案 0 :(得分:7)

您可以使用itertools.cycle()永久循环,然后您可以使用itertools.chain()附加起始条件,如:

import itertools as it
for i in it.chain((0,), it.cycle(range(1, 6))):
    print(i)

结果:

0
1
2
3
4
5
1
2
3
4
5

答案 1 :(得分:1)

所以我从评论中意识到我必须像这样使用while循环

i = 0
while i < 10:
    print(i)
    if i == 5:
        i = 1

上面使用itertools和chain的例子很不错,但是我想在循环时想要这样的解决方案,但我没有想到。在我的代码中,有一些更复杂的条件,不仅仅是这个简单的“链”,但我认为它足以演示“跳”。

答案 2 :(得分:0)

@Stephen我试着没有连锁店,工作得很好。好的代码

import itertools as it
for i in it.cycle(range(1, 6)):
    print(i)

答案 3 :(得分:0)

您可以使用迭代器类重现大部分C样式for循环。

例如:

class cFor:   
    def __init__(self,start,condition,step=1):
        self.index     = start
        self.nextIndex = start
        self.doLoop    = condition
        if type(condition) == type(start):
            self.doLoop  = lambda x:x < condition
        self.getNext   = step
        if type(step) == type(start):
            self.getNext = lambda x:x + step

    def __iter__(self):
        return self

    def next(self) : return self.__next__()

    def __next__(self):
        if self.doLoop(self.nextIndex):
            self.index     = self.nextIndex
            self.nextIndex = self.getNext(self.index)
            return self.index
        raise StopIteration()

这将允许您执行简单的循环:

for i in cFor(0,10,2) : print(i)
# 0, 2, 4, 6, 8

并且,使用lambdas,您可以提供自己的条件和增量计算:

for i in cFor(1, lambda i:i<=10, lambda i:i+3): print(i)
# 1, 4, 7, 10

或应用更复杂的“内联”计算:

[ a for a,b in cFor((1,1),lambda ab:ab[1]<30,lambda ab:(ab[1],sum(ab))) ]
# [ 1, 1, 2, 3, 5, 8, 13 ]

为了能够修改循环中的索引(或条件或增量),您可以创建一个返回当前索引和迭代器实例的生成器函数。这将允许您控制循环体内迭代器的属性。

def cForLoop(start,condition,step=1):
    loop = cFor(start,condition,step)
    while True : yield loop.next(), loop

for i,loop in cForLoop(0,10):
    print(i)
    if i == 5 : loop.nextIndex = 1
# 0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ....
例如,您可以使用它来实现简单的冒泡排序:

arr = [3,7,4,2,8,1,6]

for i,loop in cForLoop(1,len(arr)):
    if arr[i-1] > arr[i] :
        arr[i],arr[i-1] = arr[i-1],arr[i]
        loop.nextIndex = max(1,i-1) 

# arr == [1, 2, 3, 4, 6, 7, 8]