在嵌套的if语句后继续使用elif?

时间:2011-12-03 05:22:37

标签: python if-statement

如果嵌套的if语句不符合条件,如何继续使用外部if?例如。我有这个(非常不切实际)的例子:

a = 2

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

我希望接下来检查== 2。我该怎么做?

(我在嵌套中有多个条件,如果我需要检查,所以我宁愿在那个外部 - 如果没有一个巨大的字符串和/或语句。我也有多个elif语句所以我不喜欢我想把那些嵌套的那些精灵混在一起。)

更深层的例子:

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()

6 个答案:

答案 0 :(得分:3)

结合条件并展平嵌套:

a = 2

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

答案 1 :(得分:3)

考虑到这个例子只是指示性的,但你最初的问题是要理解嵌套if-else,关联,范围......

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

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

你的例子

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相关联,您能轻易说出来吗?

答案 2 :(得分: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在这里添加一些快捷方式。但是使用显式的“if nothandled”会使代码更加冗长,逻辑更容易添加新选项。)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您想要什么结果:

    当li为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 ):是一种陌生的模式,会导致读者放慢速度,并且可能在将来避开这条路。

答案 5 :(得分: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]()