你能“重新启动”Python 循环的当前迭代吗?

问题描述 投票:0回答:8

有没有办法实现这样的事情:

for row in rows:
    try:
        something
    except:
        restart iteration
python for-loop iteration
8个回答
25
投票

您可以将

try/except
块放入另一个循环中,然后在成功时中断:

for row in rows:
    while True:
        try:
            something
            break
        except Exception: # Try to catch something more specific
            pass

6
投票

您可以将行设置为迭代器,并且仅在没有错误时才前进。

it = iter(rows)  
row = next(it,"")
while row:
    try:
        something
        row = next(it,"")
    except:
       continue

顺便说一句,如果您还没有捕获特定的错误,那么您不想捕获所有内容。

如果您有 Falsey 值,您可以使用对象作为默认值:

it = iter(rows)
row, at_end = next(it,""), object()
while row is not at_end:
    try:
        something
        row = next(it, at_end)
    except:
        continue

3
投票

虽然我不建议这样做,但唯一的方法是创建一个 While (True) 循环,直到它完成。


请记住无限循环的可能性。

something



1
投票

for row in rows: try: something except: flag = False while not flag: try: something flag = True except: pass



1
投票
while True: for row in rows: if(condition) ..... if(condition) break if(condition) break

参数控制尝试次数:

max_retry



0
投票

def do_something(retry=0, max_retry=4): try: print('something') except Exception as e: if retry == max_retry: print(f"Max retries reached!") raise e do_something(retry=retry + 1, max_retry=max_retry) do_something()



0
投票
it = iter(rows) while True: try: something row = next(it) except StopIteration: it = iter(rows)

是一个列表,你可以做

rows

此外,在其他条件相同的情况下,Python 中的 for 循环比 while 循环更快。 
话虽这么说,性能并不是 Python 中的一阶决定因素。


0
投票
for row in rows: try: something except: # Let's restart the current iteration rows.insert(rows.index(row), row) continue # <-- will skip `something_else`, i.e will restart the loop. something_else

而不是

continue
,因为它将确保重新启动
pass
循环。
while True

我将为 Python 新用户解释一下:

for row in rows: while True: try: ... break except Exception: continue

只会破坏你正在工作的循环。所以如果你有这样的东西:(变量和函数是虚构的)

break

并且您想跳过一个像素,您可以 
for x in imgWidth: for y in imgHeight: if ...: break drawPixel(x, y, "#FF0000")

循环,因为它将返回到上一个级别。

break
也是如此。
现在回到例子:

continue

您可以将想要在 
for row in rows: while True: try: ... break except Exception: continue

块内运行的任何代码移动。它会尝试执行此操作,如果捕获到错误,它将重试,因为我们

try
循环!当它最终没有错误地执行代码时,它
continue
现在又回到了
while True
循环中。然后它继续下一次迭代,因为它没有什么可做的。
    

© www.soinside.com 2019 - 2024. All rights reserved.