Python,为什么有elif关键字?

rai*_*syn 59 python keyword

我刚刚开始编程Python,我想知道elif关键字.

我在使用之前使用过的其他编程语言else if.有没有人知道为什么Python开发人员添加了额外的elif关键字?

为什么不:

if a:
    print("a")
else if b:
    print("b")
else:
    print("c")
Run Code Online (Sandbox Code Playgroud)

Ada*_*ear 117

据我所知,这是为了避免过度缩进.你可以写

if x < 0:
    print 'Negative'
else:
    if x == 0:
        print 'Zero'
    else:
        print 'Positive'
Run Code Online (Sandbox Code Playgroud)

if x < 0:
    print 'Negative'
elif x == 0:
    print 'Zero'
else:
    print 'Positive'
Run Code Online (Sandbox Code Playgroud)

真是太好了.


感谢ign文档的引用:

关键字elif是'else if'的缩写,有助于避免过度缩进.

  • @Adam:那么`else`和`if`在同一行中的`else if`怎么样?我认为这就是OP的意思. (50认同)
  • "else if"并不总是一个关键字.例如,在C#中,它只是一个嵌套,如果类似于我在第一个例子中写出来的方式.只是C#不关心空格和python一样多,所以在一行上写出"else if"是有效的.至于为什么它被称为"elif"而不是"elseif","elsif"或其他什么,我不知道.语言是不同的,只是因为有些人以某种方式做事,并不意味着每个人都必须效仿.:) (17认同)
  • 只是添加更多的上下文和来源:http://docs.python.org/2/tutorial/controlflow.html (2认同)
  • 从来没有意识到C中的'else if`可能只是'else`和`if`,我一直认为它是一个关键字,但这更有意义.C是一种没有固定样式的小语言(这就是为什么Python需要一个额外的`elif`),只使用一个带有空格的关键字会很奇怪.谢谢哈哈! (2认同)
  • 这应该是公认的答案恕我直言。我的直觉是选择elif来使内容对齐(else和elif共享相同的字符数),并保持编辑器列的宽度最小(else if关键字占用更多条件可能占用的空间),但是再次,纯粹是预感。 (2认同)

Ben*_*Ben 67

具有类似C语法的语言可以else if免费获得而无需实现它.

原因在于语法控制结构只是对下一个语句进行操作,如果需要,可以是括在括号中的复合语句(例如{ x += 1; y += 1 }).

这意味着,一旦你已经实现了ifelse,else if刚掉下来自然自由语言的语法,没有进一步的实施工作.要了解原因,请看一下:

if (condition) {
    if_body();
} else if (another_condition) {
    else_if_body();
} else {
    else_body();
}
Run Code Online (Sandbox Code Playgroud)

这看起来像if带有else ifelse附加,每个都应用于复合语句.但事实上并非如此.这实际上是两个单独的if陈述,每个陈述只有一个else案例; 第二个if陈述else在第一个if陈述的主体内.

else if { ... }实际上解析为else应用于下一个语句,这是一个if语句(应用于复合语句{ else_if_body(); }.然后最后else绑定到前一个if,这是第二个.

这里写的更符合它的解析方式1:

if (condition) {
    if_body();
} else {
    if (another_condition) {
        else_if_body();
    } else {
        else_body();
    }
}
Run Code Online (Sandbox Code Playgroud)

但事实证明,如果语言直接实现else ifif语句的第一类选项,它的行为与第一个语句中的第二个独立语句完全相同!所以根本不需要打扰实施; 语言实现者在实现和实现后,可以使用这种语法免费获得.ifelseelse ifelse ififelse

Python的语法不允许这个免费赠品.

C风格的语法的程序员可以想到来讲else if,即使语言只if用准确的零或一else,但只是因为他们可以编写代码就像是在看不同的人的读者比格式化的方式,我的第一个例子它对编译器有用.

Python,OTOH,使用缩进来指示块结构,这迫使块结构对于人类阅读器看起来与对解释器2看起来相同.一旦你得到了ifelse在Python风格的语法,程序员仍然可以编写代码的行为等同于其他假设,通过把第二个if语句中的else一首.但这看起来像这样:

if condition:
    if_body()
else:
    if another_condition:
        else_if_body()
    else:
        else_body()
Run Code Online (Sandbox Code Playgroud)

这看起来很丑陋,一旦你获得超过1或2个其他ifs,就比else-if链更复杂.所以值得添加一个明确的语言功能,以恢复使用else-if进行思考的能力.虽然它在技术上使语言变得更加复杂,但它实际上使得语言思维更简单,因此它具有很好的复杂性; 在手动构造的嵌套ifs 链中else,读者必须手动读取所有代码并验证else除了最后一个之外的每个代码都只包含一个if语句而不是其他任何内容,以便得出结论整个序列等同于一个线性条件链检查顺序,一些代码执行第一次检查成功.

那么.我们已经看到具有类似C语法的语言也可以使用else if,因为它们是免费获得的.这就是为什么存在的原因.具有类似Python语法的语言必须明确地做一些事情来获得可以用作else-if的构造.他们为什么选择elif?这是任意的; 你必须实际问问做出决定的人.

然而,Python没有发明elif,在Python存在之前很久就存在于其他语言中.所以我猜想当他们必须实现一个显式的else-if结构时,他们只选择一个程序员已经熟悉的结构.


1从技术上讲,这就是那些真正认真对待总是使用带控制结构的大括号的人应该如何编写代码.;)

2你当然可以构造反例,但这是基于缩进语法的一般概念.

  • 在第一个脚注中,每一个C风格指南都写过“始终在控制结构中使用花括号”,然后有一个v1.1,其中有人在其中写下“ if if else”。每个自动格式化或样式检查器都有一个v1.1,相对简单的解析树在if的情况下增加了一个丑陋的特殊情况。每种“ C但更好”的语言都从其设计开始,即需要大括号,然后添加异常,破坏了其一明信片式语法和琐碎的解析器。(或者他们只是添加一个elif / elsif / elsei关键字。) (2认同)

Lie*_*yan 16

为了避免支撑^ H ^ H ^ H ^ H ^ Helse如果战争.

在C/C++中else if,您可以使用多种不同的样式构建代码:

if (...) {
    ...
} else if (...) {
    ...
}


if (...) {
    ...
} 
else if (...) {
    ...
}

if (...) {
    ...
} else 
if (...) {
    ...
}

// and so on
Run Code Online (Sandbox Code Playgroud)

由具有elif相反,这样的战争将永远不会发生,因为只有写的一个途径elif.而且,elif比短得多else if.

  • 最后一个例子看起来很痛苦.在你身上造成这种无辜眼睛的祸患. (18认同)
  • 我无法理解如果它存在于Python中,那么`else if`会导致支撑战. (18认同)
  • @ypercube:http://answers.google.com/answers/threadview/id/386870.html (5认同)

Gor*_*son 9

就是那样子.Javascript使用else if,php使用elseif,perl使用elsif,C预处理器和python使用elif.它们都没有错,它们只是选择稍微不同的语法来做同样的事情.:d

  • 直到这个答案我才想到 C 使用 `else if` 而 CPP 使用 `elif`,所以你经常最终将两者混合在一个文件中。 (4认同)

Edd*_*ono 6

我发现它们有助于区分"else-if"和"最终的其他".


Dan*_*ite -3

最有可能的是语法糖。就像WendVisual Basic 的一样。

  • 我不确定这实际上是如何解决为什么 Python 实现者选择“elif”而不是“else if”的问题? (24认同)
  • “elif”*不*只是“else if”的简写。`else if` 实际上在 python 2 和 python 3 中都是一个语法错误。 (14认同)