何时使用if / else组合而不是elif更有效?

时间:2014-09-24 21:33:22

标签: python

在学习Python的艰难之路中,学生的一个问题是:

  

你能用一系列if-else组合替换elif吗?

     

在某些情况下,您可以使用,但这取决于每个if / else的写入方式。这也意味着Python将检查每个if-else组合,而不是像if-elif-else那样只检查第一个假组合。

当他说"在某些情况下,"我只是想知道何时使用这些序列替换elif更有效。

编辑:这两段代码的执行方式有什么不同吗?

print "You enter a dark room with two doors.  Do you go through door #1 or door @2?"

door = raw_input("> ")

if door == "1":
    print "Hello."
        # More if/else here
        # ...
        # ...

if door == "2":
    print "Hello again."
        # More if/else here
        # ...
        # ...

else:
    print "End."
  

print "You enter a dark room with two doors.  Do you go through door #1 or door @2?"

door = raw_input("> ")

if door == "1":
    print "Hello."
        # More if/else here
        # ...
        # ...

elif door == "2":
    print "Hello again."
        # More if/else here
        # ...
        # ...

else:
    print "End."

2 个答案:

答案 0 :(得分:3)

可以用if ... if ... elif块替换一系列else语句的一种情况是每个if } statement包含return

def check(something):
    if something == 1:
        return "foo"
    if something == 2:
        return "bar"
    return "n/a"

在这种情况下,return表示到达第二个if时,您知道第一个条件为false,因此任何else }或elif是多余的。此外,在这种特殊情况下,如果您需要重新排序if语句,它会稍微容易一些,因为您不必担心在elif子句之前结束的if子句,等等。

答案 1 :(得分:1)

奇怪的用法,因为python在技术上没有明确的switch语句,就是使用ifs的组合作为具有穿透性的伪开关。

我不会在技术上推荐这个,因为它有点难以调试和维护,而且不是非常pythonic,但它是一个正常的选项,如果/ elif不合适。

def do_something(x):
    y = ""
    if x == 1:
        y += "This and " 
    if x == 1 or x == 2:
        y += "That"
    if x == 3:
        y += "The Other"
    return y

编辑:

至于您提供的代码,主要区别在于创建的逻辑。一系列ifs将被设置为可评估,因此您可能遇到以您不期望的方式修改变量的问题。

if / elif只会在达到有效声明或最终其他声明之前进行评估。

所以简短的回答是你 MAY 想要一系列if而不是if / elifs如果你正在处理影响多个变量的多个触发器,模拟带有穿透的开关,或者它是基于每个if的简短回报语句。大多数情况下if / elif会更正确,效率更高。

此外,在编译结束时,编译器可能能够使用if / elifs而不是一系列ifs更好地处理分支预测。