Python中为什么有elif关键字?

72 投票
8 回答
40203 浏览
提问于 2025-04-16 04:18

我刚开始学习Python编程,想问一下关于elif这个关键词的事。

我之前用过的其他编程语言都是用else if。有没有人知道为什么Python的开发者要加一个额外的elif这个关键词呢?

为什么不直接用:

if a:
    print("a")
else if b:
    print("b")
else:
    print("c")

8 个回答

86

像C语言这样的编程语言,使用else if这个结构非常简单,几乎不需要额外的实现。

原因在于,在这种语法中,控制结构只作用于下一个语句,如果需要的话,这个语句可以是用大括号包起来的复合语句(比如{ x += 1; y += 1 })。

这意味着,一旦你实现了ifelseelse if就自然而然地从语言的语法中出来了,不需要额外的工作。想了解原因,可以看看这个例子:

if (condition) {
    if_body();
} else if (another_condition) {
    else_if_body();
} else {
    else_body();
}

这看起来像是一个带有else ifelseif语句,每个都应用于一个复合语句。但实际上并不是。这实际上是两个独立的if语句,每个都有一个else情况;第二个if语句是在第一个if语句的else部分里面。

else if { ... }实际上是被解析为else作用于下一个语句,而这个语句是一个if语句(作用于复合语句{ else_if_body(); })。然后最后的else绑定到紧接着的if,也就是第二个if

这里是更符合解析方式的写法1

if (condition) {
    if_body();
} else {
    if (another_condition) {
        else_if_body();
    } else {
        else_body();
    }
}

但事实证明,如果语言直接将else if作为if语句的一个选项来实现,它的行为将与第一个ifelse里面的第二个独立if语句完全相同!所以根本不需要去实现else if;一旦实现了ifelse,语言的设计者就可以免费获得else if

而Python的语法就不允许这种“免费”的特性。

使用C风格语法的程序员可以在思考时使用else if,即使语言中只有if和最多一个else,这只是因为他们可以写出像我第一个例子那样的代码,这种格式对人类读者看起来不同于编译器。

而Python则使用缩进来表示代码块结构,这使得代码块的结构对人类读者和解释器看起来是一样的2。一旦在Python风格的语法中有了ifelse,程序员仍然可以通过在第一个ifelse里面放一个第二个if语句来写出与else if行为相同的代码。但这样看起来就像这样:

if condition:
    if_body()
else:
    if another_condition:
        else_if_body()
    else:
        else_body()

这看起来很丑,而且当有超过1或2个else if时,思考起来要复杂得多。因此,值得在语言中添加一个明确的特性,以恢复使用else if的能力。尽管这在技术上使语言更复杂,但实际上使得在语言中思考变得更简单,所以这是好的复杂性;如果手动构造一系列嵌套的ifelse里面,读者必须手动阅读所有代码,并验证每个else(除了最后一个)都包含恰好一个if语句和没有其他内容,才能得出整个序列等同于按顺序检查的条件链,并在第一个成功的检查中执行一些代码。

所以,我们看到,像C这样的语言可以轻松使用else if,因为他们可以免费获得。这就是为什么会有这个结构的原因。而像Python这样的语言必须明确做些什么,才能得到一个可以用作else if的构造。为什么他们选择elif?这只是个随意的选择;你得去问做出这个决定的人。

不过,Python并不是elif的发明者,它在Python出现之前就已经在其他语言中存在了。所以我猜,当他们需要实现一个明确的else if构造时,他们只是选择了一个程序员已经熟悉的。


1从技术上讲,这就是那些非常认真对待控制结构总是使用大括号的人应该写代码的方式。;)

2当然,你可以构造反例来反驳这一点,但这就是基于缩进语法的一般想法。

122

据我所知,这个是为了避免过多的缩进。你可以写

if x < 0:
    print 'Negative'
else:
    if x == 0:
        print 'Zero'
    else:
        print 'Positive'

但是

if x < 0:
    print 'Negative'
elif x == 0:
    print 'Zero'
else:
    print 'Positive'

看起来就是好太多了。


感谢 ign 提供的 文档 参考:

关键字 elif 是 'else if' 的缩写,它可以帮助我们避免过多的缩进。

-3

这很可能是语法糖。就像Visual Basic里的Wend一样。

撰写回答