嵌套if语句后如何继续到elif?

1 投票
6 回答
17605 浏览
提问于 2025-04-17 07:35

如果里面的if语句没有满足条件,我该怎么继续检查外面的if呢?比如,我有一个(非常不实用的)例子:

a = 2

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

我想接下来检查a是否等于2。我该怎么做呢?

(我在那个嵌套的if里有多个条件需要检查,所以我不想在外面的if里写一大堆的与或语句。我还有多个elif语句,所以我也不想把所有的elif都放在那个嵌套的if下面。)

再举个更复杂的例子:

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 个回答

3

考虑到这个例子只是个参考,你最初的问题是想理解嵌套的if-else、关联和作用域等等。

在Python中,不像一些其他语言(比如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关联的吗?

5

把条件合并起来,并把嵌套的结构变得简单:

a = 2

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

你怎么能指望计算机能明白这个呢?

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

有很多方法可以实现这个功能。我比较喜欢 函数+返回 的方式,因为这样代码结构清晰。另一种方法是使用一个 处理标志

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来简化代码,但使用明确的“如果未处理”会让代码逻辑更清晰,也更容易添加新的选项。)

撰写回答