与Python中的for ... else相反的是什么?

7
下面的Python代码将打印出n(14),因为for循环完成了。
for n in range(15):
    if n == 100:
        break
else:
    print(n)

然而,我希望相反的情况发生。是否有一种方法可以实现for ... else(或while ... else)循环,但仅在循环中断时执行else代码?


现在太累了,没办法写出解决方案(也许过会儿再写吧!)但使用上下文管理器可能是一个解决方案!灵感来源可能在这里:https://dev59.com/jnVC5IYBdhLWcg3wxEJ1#3171971 - jeromej
4个回答

15

Python(或我所知道的任何语言)中没有类似于for...elseifbreak的明确结构,因为您可以简单地执行以下操作:

for n in range(15): 
    if n == 100:
        print(n)  
        break

如果你有多个break,请将print(n)放在一个函数中,这样可以避免重复

肯定不是 OP 想要的吧? - Sanjay Manohar
5
为什么不呢?这样做效果是一样的。如果你想让代码在遇到break语句时继续运行,那就在break语句之前运行相应的代码即可。 - matt b
我个人没有看到过那样的结构,但你总可以使用 *打颤* goto - NullUserException
1
重点是,OP想要的不是他真正想要的,有更好的方法来做到这一点。 - mk12

7

如果您在循环中断点处多次中断,且不想重复编写代码,那么可以使用异常来实现更通用的解决方案:

try:
    for n in range(15):
        if n == 10:
            n = 1200
            raise StopIteration()
        if n > 4:
            n = 1400
            raise StopIteration()
except StopIteration:
    print n

4

到目前为止,我并不是很喜欢已发布的答案,因为它们都需要更改循环体,如果循环体非常复杂,这可能会很烦人/有风险,所以这里介绍一种使用标志来完成的方法。将_break替换为found或其他适合您用例的有意义的内容。

_break = True
for n in range(15):
    if n == 100:
        break
else:
    _break = False

if _break:
    print(n)

如果循环没有找到匹配项,另一个可能的解决方法是在else:块中使用return来什么也不做的函数:

for n in range(15):
    if n == 100:
        break
else:
    return
print(n)

0

使用:

for n in range(15):
    if n == 100:
        break
else:
    print("loop successful")
if n != range(15)[-1]:
    print("loop failed")

如果break发生在最后一次循环迭代中,这将给出错误的结果。在这种情况下,它将打印“循环成功”和“循环失败”两者。 - Sven Marnach
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Dima Kozhevin
1
你好!虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Brian61354270

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接