2014-11-22 34 views
4

我有一个for循环来测试一个条件。如果条件从未满足,我想执行一些代码。下面的代码则正好相反:对于for-else循环中的“else”是否有逆向行为?

a = [1, 2, 3] 
for k in a: 
    if k == 2: 
     break 
else: 
    print("no match") 

,如果未达到所述break“不匹配”被打印(对于类似k == 10例如一个条件)。是否有相反的结构,即如果达到了break,则运行一些代码?

我知道我可以这样做

a = [1, 2, 3] 
match = False 
for k in a: 
    if k == 2: 
     match = True 
if match: 
    print("match") 

但寻找一个更紧凑的解决方案,而不标志变量..

注意:我现在从我做的答案实现不清楚我想将“匹配的”代码移到for循环之外。它会相当大,我想避免把它隐藏在for循环(因此标志变量的想法)

回答

2

如果你把你的条件函数或理解里面,你可以使用any关键字非常Python化的方式来做到这一点。

if not any(k == 2 for k in a): 
    print 'no match' 

如果你的条件移动到返回boolean值的功能,你可以概括如下:

def f(x): 
    return x == 2 

if not any(f(k) for k in a): 
    print 'no match' 
+0

谢谢 - 这确实(尽管以完全不同的方式)正是我想要的:一种紧凑的方式来检查条件之前,如果没有匹配,启动代码。 – WoJ 2014-11-22 17:39:43

1

当然。只要把它放在break之前。

a = [1, 2, 3] 
for k in a: 
    if k == 2: 
     print("found") # HERE 
     break 
else: 
    print("no match") 
+0

感谢您的回答 - 我意识到,我没有说清楚,我想让代码在循环之外(它会很大)。我更新了这个问题。 – WoJ 2014-11-22 16:49:22

+1

如果你想这样做,请使用标志。这不是一个常见的用例,它有一个语言功能。 – kindall 2014-11-22 16:50:49

+0

@WoJ看看Mike的回答,特别是第二个片段:你的循环的主体将驻留在'f'中,并且底部条件完全分开。 – Kroltan 2014-11-22 17:14:02

1

为什么不干脆:

a = [1, 2, 3] 
for k in a: 
    if k == 2: 
     print("match") 
     break 
+0

感谢您的答案 - 我意识到我没有说清楚,我想让代码在循环之外(它会很大)。我更新了这个问题。 – WoJ 2014-11-22 16:50:03