python:重启循环

时间:2009-01-29 18:37:52

标签: python loops

我有:

for i in range(2,n):
    if(something):
       do something
    else:
       do something else
       i = 2 **restart the loop

但这似乎不起作用。有没有办法重新启动该循环?

由于

5 个答案:

答案 0 :(得分:29)

您可能需要考虑使用不同类型的循环,因为这是最明显的答案。

也许是:

i=2
while i < n:
    if something:
       do something
       i += 1
    else: 
       do something else  
       i = 2 #restart the loop  

答案 1 :(得分:13)

从循环中更改索引变量i不太可能达到预期效果。您可能需要使用while循环,并自行控制循环变量的递增。每次for循环,i都会重新分配range()的下一个值。如下所示:

i = 2
while i < n:
    if(something):
        do something
    else:
        do something else
        i = 2 # restart the loop
        continue
    i += 1

在我的示例中,continue语句跳回到循环的顶部,跳过该迭代的i += 1语句。否则,i会按预期递增(与for循环相同)。

答案 2 :(得分:3)

以下是使用生成器send() method

的示例
def restartable(seq):
    while True:
        for item in seq:
            restart = yield item
            if restart:
                break
        else:
            raise StopIteration

示例用法:

x = [1, 2, 3, 4, 5]
total = 0
r = restartable(x)
for item in r:
    if item == 5 and total < 100:
        total += r.send(True) 
    else:
        total += item

答案 3 :(得分:1)

只是想发布一个可能更常用的替代品。大多数现有解决方案使用循环索引来避免这种情况。但是你不必使用索引 - 这里的关键是与for循环不同,循环变量被隐藏,循环变量被暴露。

您可以使用迭代器/生成器执行非常类似的操作:

x = [1,2,3,4,5,6]
xi = iter(x)
ival = xi.next()
while not exit_condition(ival):
    # Do some ival stuff
    if ival == 4:
        xi = iter(x)
    ival = xi.next()

它不是那么干净,但仍然保留了写入循环迭代器本身的能力。

通常,当你认为你想要这样做时,你的算法是错误的,你应该更干净地重写它。你真正想要做的就是使用生成器/协同程序。但这至少是可能的。

答案 4 :(得分:0)

a = ['1', '2', '3']
ls = []
count = False

while ls != a :
    print(a[count])
    if a[count] != a[-1] :
        count = count + 1
    else :
        count = False

循环重启。