我刚开始学习Python编程,想了解一下elif
关键字。
我之前使用过其他编程语言,使用的是else if
。有没有人知道Python开发者为什么要添加额外的elif
关键字?
为什么不这样:
if a:
print("a")
else if b:
print("b")
else:
print("c")
else
和if
在同一行中,那么else if
怎么办?我认为这就是原帖的意思。 - Manoj Govindanelse if
可以简写成 else
和 if
,我一直把它看作是一个关键字,但这种写法更合理。C 是一种没有固定风格的小语言(这就是为什么 Python 需要额外的 elif
),使用带有空格的单个关键字会让人感到奇怪。谢谢哈! - Jori类C语言语法的编程语言会自带else if
而无需额外实现。
原因是该语法中的控制结构只是针对下一条语句进行操作,如果需要,它可以是用括号括起来的复合语句(例如{ x += 1; y += 1 }
)。
这意味着一旦您已经实现了if
和else
,else if
就会自然而然地免费获得语言语法上的支持,无需进一步实现。为了理解其中的原因,请看这个例子:
if (condition) {
if_body();
} else if (another_condition) {
else_if_body();
} else {
else_body();
}
这看起来像是一个带有复合语句的if
、else if
和else
的结构。但实际上它不是,这实际上是两个单独的if
语句,每个都有一个else
语句;第二个if
语句位于第一个if
语句的else
体内。
else if { ... }
实际上被解析为应用于下一条语句的else
,该语句是一个(应用于复合语句{ else_if_body(); }
的)if
语句。然后最终的else
绑定到紧接着的前一个if
语句,即第二个if
语句。if (condition) {
if_body();
} else {
if (another_condition) {
else_if_body();
} else {
else_body();
}
}
但事实证明,如果语言直接将else if
作为if
语句的一级选项实现,它将与第二个独立的位于第一个else
中的if
语句完全相同!所以根本没有必要实现else if
;一旦实现了if
和else
,语言实现者就可以通过这种语法风格免费获得else if
。
Python的语法不允许这种免费的操作。
C语言风格的编程人员可以在思考时使用else if
,即使该语言只有恰好有零个或一个else
,但这仅因为他们可以编写格式化方式与人类读者看起来不同于编译器的第一个示例代码。
另一方面,Python使用缩进来表示块结构,这迫使块结构对于解释器和人类读者来说看起来是相同的2。一旦你用Python语法风格实现了if
和else
,程序员仍然可以编写行为与else-if完全相同的代码,方法是在第一个else
中放置第二个if
语句。但是,这看起来像这样:
if condition:
if_body()
else:
if another_condition:
else_if_body()
else:
else_body()
当你有多个else-if时,使用嵌套的if语句会使代码变得复杂难懂,看起来也很丑。因此,值得添加一个明确的语言特性来恢复使用else-if的能力。尽管这技术上使语言更加复杂,但实际上使得基于语言思考更简单了,所以它是好的复杂性。使用手动构建的嵌套if语句和else语句序列时,读者必须手动阅读所有代码,并验证除了最后一条外的每个else都只包含一个if语句而没有其他内容,才能得出结论:整个序列等价于按顺序检查的线性条件链,并在第一个成功的条件检查时执行一些代码。
因此,我们可以看到,具有类C语法的编程语言可以使用else if
,因为它们已经拥有了这个特性。这就是它存在的原因。具有类Python语法的编程语言必须显式地做一些事情才能得到可用作else-if的结构。为什么他们选择了elif
?这是任意的;您必须向制定决策的人询问。
然而,Python并没有发明elif
,它早在Python存在之前就已经存在于其他编程语言中。因此,我猜当他们不得不实现一个明确的else-if结构时,他们只是选择了程序员已经熟悉的一个。
1从技术上讲,这是那些真正重视在控制结构中始终使用大括号的人应该编写的代码。
2您肯定可以构造反例,但这是基于缩进的语法的一般思想。
为避免“括号^H^H^H^H^H else if”战争。
在C/C++中,当你使用else if
时,可以以许多不同的方式组织你的代码:
if (...) {
...
} else if (...) {
...
}
if (...) {
...
}
else if (...) {
...
}
if (...) {
...
} else
if (...) {
...
}
// and so on
如果改用elif
,就不会发生这种错误了,因为只有一种方法可以写一个elif
。此外,elif
比else if
更短。
else if
,我无法理解它会如何导致大括号之争。 - ypercubeᵀᴹ这就是事实。 Javascript 使用else if
,php 使用elseif
,perl 使用elsif
,C预处理器和python使用elif
。它们都没有错,只是选择了略有不同的语法来完成相同的事情。 :D
else if
而C++使用elif
,因此在单个文件中通常会混用两者。 - ArtOfWarfare我发现它们很有帮助,可以帮助区分“else-if”和“最后的else”。
elif
是一种在其他语言中用作switch替代的功能,但具有更强大的功能。
例如,在C语言中,您可以编写:
switch (number){ case 1: doA() break; case 2: doB() break; case N: doN() break; default: doSomethingElse() break; }
在Python中,您可以编写:
if number == 1: doA() elif number == 2: doB() elif number == N: doC() else: doSomethingElse()
正如您所看到的,elif
比switch更强大,因为您可以放置更复杂的语句,并避免嵌套if/else
语句。
elif
是C语言中else if
的类比,具有完全相同的功能(尽管它是使用不同的解析规则实现的)。即使在C语言中,您也可以使用else if
代替case
。这当然与为什么Python中使用elif
而不是else if
无关。 - Ben很可能这只是语法糖。就像 Visual Basic 中的 Wend
一样。
elif
而不是 else if
的问题。 - Benelif
并不仅仅是else if
的简写。实际上,在Python 2和Python 3中,else if
是语法错误。请注意,这并非解释。 - JSQuareDelif
被添加为特殊情况一样,同样可以在 else
后面没有冒号的情况下添加 else if
。 - NemePython从Perl继承了这一点,在Perl中它被称为elsif
。
在Python的情况下,将else if
作为C语言样式中的两个独立结构将会非常丑陋,因为您必须使用两个缩进级别else: if:
。
特殊处理这两个关键字是否更好仍有争议(使else if
成为单个结构,如not in
运算符)。
PL / SQL也有elsif
,C预处理器将其拼写为elif
。
elif
这个语法的。我认为Bash是从比Perl更古老的sh继承而来的。 - slebetman
elsif
。 - slebetmanelif
部分。将其翻译为“同时也要查看bash / sh中的'elif'部分”。 - slebetman