繁体   English   中英

嵌套的if语句后继续到elif吗?

[英]Continue to elif after a nested if-statement?

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

a = 2

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

我想要== 2接下来要检查。 我该怎么做?

(我有多个条件嵌套在其中,如果需要检查的话,所以我宁愿在那个外部if中没有大量的and /或语句。我也有多个elif语句,所以我不想将所有Elif合并到一个嵌套的Elf中。)

更深入的例子:

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

结合条件并展平嵌套:

a = 2

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

考虑到该示例仅是指示性的,但您最初的问题是了解嵌套的if-else,关联,作用域...。

在Python中,与类似Algol的语言不同,我们没有标界的块(例如,在C语言中,我们使用'{'来构成一个块。这里所有的块都是通过适当的空格缩进。就像哲学一样,您所读的内容这就是您的目标,这是坚持“代码可读性”的设计理念。

在类似的上下文中,后续的if/else语句将成为外部if语句还是内部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与之关联?

您如何看待计算机清楚这一点?

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 unhandled”会使代码在逻辑上更加冗长, 并且更容易添加新选项。)

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

您想要什么结果:

  • 当a为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 ):是一种不熟悉的模式,它会导致读者因速度波动而变慢,并可能避免这种情况未来的路。

使其更易于阅读并且可能更容易编写的另一种书写方式是将其中一张支票的选择放入字典中。 这仅在您实际检查相等性时才有效,但可能对您有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM