2017-06-23 17 views
2

これらの2つの異なるコード組織の間に意味またはランタイムの違いはありますか?それとも、単に簡潔さと空白の問題ですか?入れ子IF/ELSEとELIFの違いは?

if something: 
    ... 
else: 
    if other: 
     ... 
    else: 
     ... 

対。

if something: 
    ... 
elif other: 
    ... 
else: 
    ... 

答えて

6

論理的な違いはありません。第二の方法を好む、それはより読みやすいです。抽象構文レベルで、それらは正確に等価であること

注:具体的には、第二のフォームが最初のフォームに変換されます

>>> s1 = '''if something: 
...  ... 
... else: 
...  if other: 
...   ... 
...  else: 
...   ...''' 
...   
>>> s2 = '''if something: 
...  ... 
... elif other: 
...  ... 
... else: 
...  ...''' 
...  
>>> ast.dump(ast.parse(s1)) == ast.dump(ast.parse(s2)) 
True 

>>> ast.dump(ast.parse(s2)) 
"Module(body=[If(test=Name(id='something', ctx=Load()), body=[Expr(value=Ellipsis())], orelse=[If(test=Name(id='other', ctx=Load()), body=[Expr(value=Ellipsis())], orelse=[Expr(value=Ellipsis())])])])" 
>>> # pip install astdump 
>>> astdump.indented(s2) 
Module 
    If 
    Name 
     Load 
    Expr 
     Ellipsis 
    If 
     Name 
     Load 
     Expr 
     Ellipsis 
     Expr 
     Ellipsis 
5

両方が同じバイトコードにコンパイルされ(CPythonで少なくとも):

>>> def a(): 
...  if something: 
...   return 1 
...  else: 
...   if other: 
...    return 2 
...   else: 
...    return 3 
... 
>>> def b(): 
...  if something: 
...   return 1 
...  elif other: 
...   return 2 
...  else: 
...   return 3 
... 
>>> from dis import dis 
>>> dis(a) 
    2   0 LOAD_GLOBAL    0 (something) 
       3 POP_JUMP_IF_FALSE  10 

    3   6 LOAD_CONST    1 (1) 
       9 RETURN_VALUE   

    5  >> 10 LOAD_GLOBAL    1 (other) 
      13 POP_JUMP_IF_FALSE  20 

    6   16 LOAD_CONST    2 (2) 
      19 RETURN_VALUE   

    8  >> 20 LOAD_CONST    3 (3) 
      23 RETURN_VALUE   
      24 LOAD_CONST    0 (None) 
      27 RETURN_VALUE   
>>> dis(b) 
    2   0 LOAD_GLOBAL    0 (something) 
       3 POP_JUMP_IF_FALSE  10 

    3   6 LOAD_CONST    1 (1) 
       9 RETURN_VALUE   

    4  >> 10 LOAD_GLOBAL    1 (other) 
      13 POP_JUMP_IF_FALSE  20 

    5   16 LOAD_CONST    2 (2) 
      19 RETURN_VALUE   

    7  >> 20 LOAD_CONST    3 (3) 
      23 RETURN_VALUE   
      24 LOAD_CONST    0 (None) 
      27 RETURN_VALUE   

唯一の違いは、 起源。他の人が言っているように、第2の変種はより清潔であり、好ましいものでなければならない。

+0

ええと、なぜdownvote? – arshajii

+0

ここでバイトコードは無関係です(そしてCPython実装の詳細)。これらは、解析/レックス段階の後で既に同等です。 – wim

+0

@wimだから何?私は、2人が最終的に同じ結果を生み出すことを証明しようとしています。 – arshajii

0

Pythonはすべてコードの可読性に関するものです。あなたはそれがPythonのもっと多くの場合にあることがわかります。 Pythonは「Less is Better」というコンセプトに従います。 あなたが聞いた質問について話すなら、逃げやすさを除いて2つの形式に違いはありません。