for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
但这似乎不起作用。有没有办法重新启动该循环?
由于
答案 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
循环重启。