2011-12-03 69 views
0

如果嵌套的if语句不满足条件,如何继续到外部if?例如。我有这个(非常不切实际)的例子:嵌套if语句后继续elif?

a = 2 

if(a > 1): 
    if(a == 3): 
     print "yes" 
elif(a == 2): 
    print "yes" 

我想要一个== 2接下来检查。我将如何做到这一点?我有多个条件,如果我需要检查,所以我宁愿没有一个巨大的字符串和/或语句在一个外部 - 如果我也有不止一个elif语句,所以我不希望所有的elifs混搭在一起,根据该嵌套一个)

更深的例子:

b = 8 

if(a > 1): 
    if(b == 3): 
     doSomething() 
    elif(b == 4): 
     doSomethingElse() 
    elif(b == 5): 
     more() 
elif(-1 <= a <= 1): 
    asd() 
elif(a < -1): 
    if(b == 7): 
     asdfasdf() 
    elif(b == 8): 
     asasdf() 
+0

'如果a> 1'后面加上'elif a == 2' ** **从来没有任何意义。因为2大于1.也许你只想要'if',而不是'elif'。或者将它封装在一个函数中,以便使用'return'。 –

回答

1

您如何期待这一点对计算机是清楚的?

if a > 1: 
    # ANYTHING 
elif a == 2: 
    # ANYTHING 

根据定义,将永远不会在第二个块中执行任何操作。

我相信你的打算可能会沿着这条线比较:

def action(): 
    if a > 1: 
    if b == 2: 
     doSomething() 
     return 
    if b == 3: 
     doSomethingElse() 
     return 
if a == 2: # Note: NO elif! 
    doDefaultForA2() 
    return 
showError("Unknown command") 
return 

有多种方式来实现这种行为。我喜欢function+return模式,因为它很好地构造代码。另一种方法是使用一个handled标志:

unhandled = True 
if a > 1: 
    if b == 2: 
    doSomething() 
    unhandled = False 
    if unhandled and b == 3: 
    doSomethingElse() 
    unhandled = False 
if unhandled and a == 2: # Note: NO elif! 
    doDefaultForA2() 
    unhandled = False 
if unhandled: 
    showError("Unknown command") 

(你可以明显地摆在了一些这里的快捷键使用ELIF但使用显式“如果未处理的”使代码有关的逻辑更容易更详细。以增加新的选项。)

+0

是的,这是一个非常糟糕的例子,并没有说明为什么我真的需要问这个真正的代码。我正在考虑突破巢穴,但回报更好,所以谢谢你。 – idlackage

+0

-1第一个选项保持'a> 1,a == 2'冗余。在第二种选择中,整个“未处理”的跳跃是一个丑陋的难以理解的难以理解的混乱。 –

+0

@JohnMachin:你没有完全理解这个问题。这不是关于“a”和实际测试,只是它们重叠,实际决定是否处理案件发生在较低层次。如果它让你快乐,用“'complexTest1(a)'”替换任何整数测试。 –

3

结合的条件和压平嵌套:

a = 2 

if (a > 1 and a == 3): 
    print "yes" 
elif (a == 2): 
    print "yes" 
+4

'a == 3'意味着'a> 1'。如果这就是你想组合它们的方式,那么根本就不需要'a> 1'。 – cHao

0
a = 2 
if a > 1: 
    if a == 3: 
     print "a is 3" 
    elif a == 2: 
     print "a is 2" 
3

考虑的例子仅仅是提示性的,你原来的问题是了解嵌套的if-else,联想,确定范围....

在Python,不像类ALGOL语言中,我们没有划分块(恩。在C中,我们使用'{'来创建一个块。这里所有的块都通过适当的空白区域缩进。它就像哲学一样,你读到的是你会得到的。这一过程是坚持“代码可读性”的设计理念。

在类似的上下文中,随后的if/else语句是外部语句还是内部语句的一部分取决于它是如何缩进的。

你的榜样

a = 2 

if(a > 1): 
    if(a == 3): 
     print "yes" 
elif(a == 2): 
    print "yes" 

这里elif是外if的一部分,因为这是它读取或者说看起来,这就是它是怎么缩进。相反,您的代码的以下修改版本

a = 2 

if(a > 1): 
    if(a == 3): 
     print "yes" 
    elif(a == 2): 
     print "yes" 

会使逻辑显然不同。更多,因为缩进的elif块现在与内部if对齐。

这是现在相比有以下C代码

if (a > 1) 
    if (a == 3) 
     printf("Hello World\n"); 
else if (a == 2) 
    printf("Yes"); 

你可以轻松地说,与如果else if关联更容易?你想

+0

我的确理解了范围,并弄清了为什么缩进elif会产生完全不同的结果,我只是不知道是否有办法进入下一个检查 - 以实现在该嵌套块中重写elif的效果,而实际上不必重写它。 – idlackage

+0

@idlackage,答案是否定的。这是Python的。如果你需要改变你的行为,你需要改变你的代码。 – Abhijit

+0

@idlackage:Abhijit说的,除了它不仅适用于Python,也适用于所有不是开玩笑或学术好奇的编程语言。 –

0

什么结果做:

  • 打印 “是” 时,为2或3
  • 否则什么也不做

翻译成简单代码

if a in (2, 3): 
    print "yes" 

“更深”的例子:你不需要你的一些嵌套。下面简单代码就相当于你:

if a == 1: 
    if b == 7: 
     print "yes 1, 7" 
    elif b == 8: 
     print "yes 1, 8" 
elif a == 2: 
    print "yes 2" 
elif a == 3: 
    print "yes 3" 
elif a == 4: 
    print "yes 4" 
elif a == 5: 
    print "yes 5" 

顺便说一句,请仔细阅读PEP 8,并看看一些其他人写的代码... if(foo == 9):是引起读者放慢一个陌生的模式速度下降,并可能在未来避开这条道路。

0

另一种编写这种方法的方法是让它更容易阅读,也可以更容易编写,将其中一个检查的选项放到字典中。这只有在你确实检查平等的情况下才有效,但可能适用于你。

#used when a>1 
bchoices1 = {} 
bchoices1[3] = doSomething 
bchoices1[4] = doSomethingElse 
bchoices1[5] = more 

#used when a==1 
bchoices2 = {} 
bchoices2[7] = asdfasdf 
bchoices2[8] = asdfas 

if(a > 1): 
    bchoices1[b]() 
elif(a == 2): 
    asd() 
elif(a == 1): 
    bchoices2[b]()