【发布时间】:2010-10-04 07:39:54
【问题描述】:
我有:
for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
但这似乎不起作用。有没有办法重新启动那个循环?
谢谢
【问题讨论】:
我有:
for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
但这似乎不起作用。有没有办法重新启动那个循环?
谢谢
【问题讨论】:
a = ['1', '2', '3']
ls = []
count = False
while ls != a :
print(a[count])
if a[count] != a[-1] :
count = count + 1
else :
count = False
重启while循环。
【讨论】:
这是一个使用生成器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
【讨论】:
只是想发布一个可能更普遍可用的替代方案。大多数现有解决方案使用循环索引来避免这种情况。但是您不必使用索引 - 这里的关键是,与 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()
它不是那么干净,但仍然保留了写入循环迭代器本身的能力。
通常,当你认为你想这样做时,你的算法是错误的,你应该更干净地重写它。可能您真正想要做的是使用生成器/协程。但这至少是可能的。
【讨论】:
您可能需要考虑在该逻辑适用的情况下使用不同类型的循环,因为这是最明显的答案。
也许是:
i=2
while i < n:
if something:
do something
i += 1
else:
do something else
i = 2 #restart the loop
【讨论】:
从循环中更改索引变量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 循环相同)。
【讨论】: