python elif 用法_Python,为什么要使用elif关键字?

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

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

为什么不:

1

2

3

4

5

6if a:

print("a")

else if b:

print("b")

else:

print("c")

查看红宝石。它做同样的事情。 IMO,这不是真正值得考虑的问题。

检出perl所在的elsif。

检出bash / sh及其elif所在的位置。

如果花时间研究更多的编程语言,您会发现这确实并不奇怪。您所经历的仅仅是缺乏对编程语言的了解。

所以,您基本上是在问为什么叫它的elif而不是elseif或else,对吗?不是为什么会有elif控制结构?

@Alex JL:正确

通过阅读邮件列表或PEP文档中的Python历史记录,您也许可以找到答案。我们可以随时向Guido发送电子邮件,希望他回答!其他一切都只是猜测。

或者在StackOverflow上问他:stackoverflow.com/users/818274/guido-van-rossum。

@asmeurer-Learning Guido拥有SO方面的知识,并且在Dropbox工作很愉快。

本斯的回答在这里是最彻底和最有用的,值得IMO接受。

@MarkSnidovich:Ruby中的elsif。它仍然是一个怪异的缩写,但至少听起来像else if

据我所知,它可以避免过度缩进。你可以写

1

2

3

4

5

6

7if x < 0:

print 'Negative'

else:

if x == 0:

print 'Zero'

else:

print 'Positive'

1

2

3

4

5

6if x < 0:

print 'Negative'

elif x == 0:

print 'Zero'

else:

print 'Positive'

好多了。

感谢ign提供的文档参考:

The keyword elif is short for 'else if', and is useful to avoid excessive indentation.

@亚当:else if在else和if在同一行的情况下呢?我认为这就是OP的意思。

"否则"并非总是单个关键字。例如,在C#中,它只是一个嵌套的,类似于我在第一个示例中的写法。只是C#并不像python那样关心空格,因此在一行上写出" else if"是有效的。至于为什么它叫做" elif"而不是" elseif"," elsif"或其他任何东西,我不知道。语言是不同的,只是因为某些事物以一种方式做事,并不意味着每个人都必须效法。 :)

只是添加更多上下文和源:docs.python.org/2/tutorial/controlflow.html

从来没有意识到C中的else if可能只是else和if,我一直认为它是一个关键字,但这更有意义。 C是一种没有固定样式的小语言(这就是Python为什么需要一个额外的elif的原因),仅使用一个带有空格的关键字会很奇怪。谢谢哈哈!

这应该是公认的答案恕我直言。我的直觉是选择elif来使内容保持一致(else和elif共享相同的字符数),并保持编辑器列的宽度最小(else if关键字占用条件可能占用的更多空间),但是,纯粹是预感。

至于是否不使用else,我认为这是一个方便编译的东西。这样,词法分析器就无需先见之明,并且使用常规词法分析器更容易实现,我认为使用" else if"代替" elif"不会有理论上的问题。

具有类C语法的语言免费获得else if,而无需完全实现。

原因是语法控制结构仅对下一条语句进行操作,下一条语句在必要时可以是用大括号括起来的复合语句(例如{ x += 1; y += 1 })。

这意味着一旦实现了if和else,else if就会自然而然地免费脱离该语言的语法,而无需进一步的实现工作。要了解原因,请查看以下内容:

1

2

3

4

5

6

7if (condition) {

if_body();

} else if (another_condition) {

else_if_body();

} else {

else_body();

}

看起来像一个带有附加else if和else的if,分别应用于复合语句。但实际上并非如此。这实际上是两个单独的if语句,每个语句只有一个else大小写;第二个if语句位于第一个if语句的else主体内。

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

这是更符合解析方式的相同内容:

1

2

3

4

5

6

7

8

9if (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,C语言语法的程序员也可以根据else if进行思考,但这仅是因为他们可以像我的第一个示例一样编写以对于人类读者而言,这种方式看起来与对编译器而言不同。

Python OTOH使用缩进来指示块结构,这迫使该块结构在人类阅读器中看起来与在解释器中相同。一旦有了Python样式语法中的if和else,程序员仍然可以通过将第二个if语句放在第一个else内,从而编写与else-if相同的代码。但是结果看起来像这样:

1

2

3

4

5

6

7if condition:

if_body()

else:

if another_condition:

else_if_body()

else:

else_body()

这看起来很丑陋,并且一旦获得超过1或2个else-if,就比else-if链而言要复杂得多。因此,有必要添加显式语言功能以恢复其他情况下的思考能力。尽管从技术上讲它使语言更复杂,但实际上使从语言方面的思考变得更加简单,因此它具有很好的复杂性。在else内使用人工构建的嵌套if链,读者必须手动读取所有代码,并验证除最后一个外的每个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关键字。)

为了避免大括号^ H ^ H ^ H ^ H ^如果发生战争,请头盔。

在具有else if的C / C ++中,可以用许多不同的样式来构造代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22if (...) {

...

} else if (...) {

...

}

if (...) {

...

}

else if (...) {

...

}

if (...) {

...

} else

if (...) {

...

}

// and so on

通过使用elif代替,这种战争将永远不会发生,因为只有一种编写elif的方法。同样,elif比else if短得多。

最后一个例子令人费解。在你无辜的眼睛上犯下此罪的人有祸了。

我不明白else if(如果它存在于Python中)将如何引发大括号战争。

@ypercube:answer.google.com/answers/threadview/id/386870.html

就是那样子。 Javascript使用else if,php使用elseif,perl使用elsif,C预处理器和python使用elif。他们都不是错,他们只是选择略有不同的语法来完成相同的事情。 :D

直到这个答案,我才没有想到C使用else if,而CPP使用elif,所以您常常最终将两者混合在一个文件中。

我发现它们有助于将"其他条件"与"其他条件"区分开。

elif是其他语言的交换机的替代品,但功能更强大

例如在C中,您编写

1

2

3

4

5

6

7

8

9

10

11

12

13

14switch (number){

case 1:

doA()

break;

case 2:

doB()

break;

case N:

doN()

break;

default:

doSomethingElse()

break;

}

用Python编写

1

2

3

4if number == 1: doA()

elif number == 2: doB()

elif number == N: doC()

else: doSomethingElse()

如您所见,elif的功能更强大,因为您可以放置??比开关更复杂的语句,并且避免嵌套if/else语句

不,elif是C中else if的类似物,具有精确相等的功效(即使使用不同的解析规则来实现)。您甚至可以在C语言中使用else if代替case。这当然与在Python中使用elif而不是else if的原因无关。

最有可能是语法糖。类似于Visual Basic的Wend。

我不确定这实际上如何解决为什么Python实现者选择elif而不是else if的问题?

elif不仅仅是else if的简写。 else if实际上是python 2和python 3的语法错误。

@JSQuareD没错,但是就像添加elif作为特例一样,对于else if也可以做同样的事情,否则就不用冒号了。

Python从Perl继承了它,它称为elsif。

在Python的情况下,else if作为两个类似的类C语言中的单独构造将非常难看,因为您必须具有两个缩进级别的else: if:。

将两个关键字一起特殊组合是否会更好是有争议的(因此,使else if成为单个构造,如not in运算符。

PL / SQL也有elsif,而C预处理器的拼写是elif。

" Python从Perl继承过来的"-Wat?

我认为他们都是从以前的语言中获得的-Python根本不是Perl的后代。

sPerlBash会更好,因为在bash中它确实是elif。而且我相信bash是从sh继承而来的,sh比Perl还要老。

Elif在Algol 68中(en.wikipedia.org/wiki/ALGOL_68)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值