嵌套if语句后如何继续到elif?
如果里面的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来简化代码,但使用明确的“如果未处理”会让代码逻辑更清晰,也更容易添加新的选项。)