2015-12-16 8 views
5

私はC、C++、Java、C#などの言語で(C# exampleelse ifという文が構文砂糖であることを知っています。実際にはelseという文の後にifという文が続きます。python "elif"はelse:ifと違ってコンパイルされていますか?

else if (conition(s)) { ... 

else { 
    if (condition(s)) { ... 
} 

に等しいしかし、Pythonで、特別なelifステートメントがあります。私はこれが開発者のための省略形にすぎないのか、Pythonが隠された最適化があるのか​​、このような理由でより速く解釈されるようにすることができるのだろうかと疑問に思いましたか?しかし、これは他の言語が(JavaScriptなどの)あまりにもそれをやっているように、私には意味をなさないでしょう。ですから、私の質問は、Pythonでelifのステートメントは開発者が使用することを単に省略したものですか、そうすることによって得られる何かが隠されていますか?

+4

'他if'は(少なくとも、C++で)でもシンタックスシュガーではないためだけ糖衣構文です。それは実際の裸の構文であり、砂糖で覆われていません。私たちがそれを書く方法を選んだのはちょっと誤っているだけです。 – chris

答えて

11

インタープリタで何が起こっているのかを本当に知りたい場合は、disモジュールを使用できます。この場合:

>>> def f1(): 
... if a: 
...  b = 1 
... elif aa: 
...  b = 2 
... 
>>> def f2(): 
... if a: 
...  b = 1 
... else: 
...  if aa: 
...  b = 2 
... 
>>> dis.dis(f1) 
    2   0 LOAD_GLOBAL    0 (a) 
       3 POP_JUMP_IF_FALSE  15 

    3   6 LOAD_CONST    1 (1) 
       9 STORE_FAST    0 (b) 
      12 JUMP_FORWARD   15 (to 30) 

    4  >> 15 LOAD_GLOBAL    1 (aa) 
      18 POP_JUMP_IF_FALSE  30 

    5   21 LOAD_CONST    2 (2) 
      24 STORE_FAST    0 (b) 
      27 JUMP_FORWARD    0 (to 30) 
     >> 30 LOAD_CONST    0 (None) 
      33 RETURN_VALUE   
>>> dis.dis(f2) 
    2   0 LOAD_GLOBAL    0 (a) 
       3 POP_JUMP_IF_FALSE  15 

    3   6 LOAD_CONST    1 (1) 
       9 STORE_FAST    0 (b) 
      12 JUMP_FORWARD   15 (to 30) 

    5  >> 15 LOAD_GLOBAL    1 (aa) 
      18 POP_JUMP_IF_FALSE  30 

    6   21 LOAD_CONST    2 (2) 
      24 STORE_FAST    0 (b) 
      27 JUMP_FORWARD    0 (to 30) 
     >> 30 LOAD_CONST    0 (None) 
      33 RETURN_VALUE   

私たちの2つの関数が同じバイトコードを使用しているようです - 明らかにそれらは同等です。

バイトコードはCPythonの実装の詳細です。すべて pythonの実装は背後で同じことをします - 重要なのは、同じ動作をすることだけです。ロジックを使って作業することで、f1f2は、基本的な実装がそれを "統語的な砂糖"として扱うかどうかにかかわらず、同じことをする必要があります。

+0

私は前に 'dis'モジュールに遭遇していませんでした、それを指摘してくれてありがとう、私はそれについてもっと読むでしょう。それが得ることができるすべてのパフォーマンスの向上を必要とするスクリプトを書いている場合、または私はこのようなことについて再度興味があります。 – hargasinski

+0

@Zequ - うん、それは通訳が何をしているのかを理解するのに本当に良いことだ。私はスクリプトでそれを使ったことはありません - Pythonがどのように動作するかを調べるための玩具の問題のみです。パフォーマンスのもう一つの有用なモジュールは 'timeit'です - あなたが実際にそれを測定するまでは何も遅くはありません;-)。 – mgilson

+0

ええ、私は、プログラムのボトルネックがあなたが最適化していたものとは全く異なる部分であることが判明したところで起こったことがあります。 'timeit'は便利です:D – hargasinski

1

elifは、多くの他の言語で見られるelse ifの構文砂糖です。それで全部です。

+0

ありがとう、私はちょうど私の推測が正しいことを確認したいと思った – hargasinski

3

キーワード 'elif'は 'else if'の略で、過度の字下げを避けるのに便利です。 Source

+0

私はそのページをスキミングし、 'elif'についての声明に気づかなかった。それを指摘ありがとう! – hargasinski

1

次の3つのコードスニペットはすべて同じロジックを使用して実行されますが、すべて異なる構文を使用します。

elif condition: ... 
else if conition { ... 
else { 
    if conition { ... 
} 

Pythonのelifは共通else if声明

関連する問題