web-dev-qa-db-ja.com

Python、なぜElifキーワード?

Pythonプログラミングを始めたばかりで、Elifキーワードについて疑問に思っています。

使用する前に使用した他のプログラミング言語else if。 Python開発者が追加のElifキーワードを追加した理由は誰にも分かりますか?

何故なの:

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

ほとんどの場合、それは構文糖です。 Visual BasicのWendと同様。

0
Daniel A. White

私の知る限り、過度のインデントを避けるためにあります。あなたは書くことができます

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'

とてもいいです。


docs リファレンスの ign に感謝します。

キーワードElifは 'else if'の短縮形であり、過度のインデントを避けるのに役立ちます。

114
Adam Lear

Cに似た構文を持つ言語は、_else if_を無料で取得します。実装する必要はありません。

その理由は、構文制御構造が次のステートメントで単純に動作するためです。必要に応じて、中括弧で囲まれた複合ステートメント(例:_{ x += 1; y += 1 }_)を使用できます。

これは、ifelseを実装すると、_else if_は無料で自然に言語の文法から外れるだけで、それ以上の実装作業は必要ありません。理由を確認するには、これを見てください:

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

これは、_else if_とifが添付されたelseに似ており、それぞれが複合ステートメントに適用されます。しかし、実際にはそうではありません。これは、実際には2つの個別のifステートメントであり、それぞれに1つのelseケースがあります。 2番目のifステートメントは、最初のelseステートメントのifの本体内にあります。

_else if { ... }_は、次のステートメントに適用されるelseとして実際に解析されます。これはifステートメント(複合ステートメント{ else_if_body(); }に適用されます。その後、最後のelseは2番目の直前のifにバインドします1。

これは、解析方法に沿ってより多く記述されたものと同じです1

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

しかし、言語がifステートメントのファーストクラスオプションとして_else if_を直接実装した場合、exactlyif内の2番目の独立したelseステートメントと同じになります最初!したがって、_else if_を実装する必要はまったくありません。言語実装者は、ifおよびelseを実装すると、このスタイルの構文で_else if_を無料で取得できます。

Pythonの構文では、この無料サービスは許可されていません。

Cスタイルの構文のプログラマは、言語がifを正確にゼロまたは1つのelseしか持たない場合でも、_else if_に関して思考できますが、それは最初の例のようなコードを書くことができるからですこれは、コンパイラーとは人間の読者にとっては異なるようにフォーマットされています。

Python(OTOH)は、インデントを使用してブロック構造を示します。これにより、ブロック構造は、インタプリタと同じように人間の読者に同じように見えます。2。 Pythonスタイルの構文でifelseを取得したら、プログラマーは、最初のifステートメント内に2番目のelseステートメントを挿入することにより、else-ifと同じように動作のコードを作成できます。しかし、それは次のようになります。

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

これは見苦しく、1つまたは2つ以上のelse-ifを取得すると、else-ifチェーンよりもはるかに複雑になります。したがって、else-ifの観点から考える能力を取り戻すために、明示的な言語機能を追加する価値があります。技術的には言語がより複雑になりますが、実際には言語がより単純になるという点で思考になるため、非常に複雑です。 ifs内のネストされたelsesの手動で構築されたチェーンでは、リーダーはすべてのコードを手動で読み取り、最後を除くすべてのelseifステートメントを1つだけ含むことを確認して、シーケンス全体が線形チェーンと同等であると結論付けます正常にチェックされた条件のうち、成功した最初のチェックのために実行するコードがあります。

それで。 Cに似た構文を持つ言語は、_else if_を使用することもあります。無料で入手できるためです。それが存在する理由です。 Pythonのような構文を持つ言語は、else-ifとして使用できる構造を取得するために、明示的に何かを行う必要があります。なぜElifを選択したのですか?それはarbitrary意的です;実際に決定を下した人に尋ねる必要があります。

しかしPythonはElifを発明しなかった、それはPythonが存在するずっと前に他の言語で存在していた。だから私はguess明示的なelse-ifコンストラクトを実装する必要があり、プログラマーがすでによく知っているものを選択しました。


1 技術的には、これは、制御構造で常に中括弧を使用することに真剣に取り組む人々がコードを書く方法です。 ;)

2 これに対する反例は確かに作成できますが、これはインデントベースの構文の一般的な考え方です。

65
Ben

かっこを避けるため^ H ^ H ^ H ^ H ^もし戦争なら。

else ifがあるC/C++では、多くの異なるスタイルでコードを構造化できます。

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


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

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

// and so on

代わりにElifを使用すると、Elifを記述する方法が1つしかないため、このような戦争は発生しません。また、Elifelse ifよりもはるかに短いです。

17
Lie Ryan

仕方ないよ。 Javascriptelse ifを使用し、 phpelseifを使用し、 Perlelsifを使用し、Cプリプロセッサおよびpython use Elif。それらのいずれも間違っていません。同じことを行うためにわずかに異なる構文を選択するだけです。

9

「else-if」と「final else」を区別するのに役立つと思います。

6
Eddy Mulyono

Elifは他の言語のスイッチの一種の代替品ですが、より強力です

たとえば、Cで書く

 switch(number){
 case 1:
 doA()
 break; 
 case 2:
 doB()
 break; 
 case N:
 doN()
 break; 
 default:
 doSomethingElse()
 break ; 
} 

in Pythonあなたが書く

 if番号== 1:doA()
 Elif番号== 2:doB()
 Elif番号== N:doC()
 else:doSomethingElse ()

ご覧のとおり、Elifはより強力です。スイッチよりも複雑なステートメントを配置でき、さらにif/elseステートメント

0
masterLoki