これらの2つの異なるコード組織の間に意味またはランタイムの違いはありますか?それとも、単に簡潔さと空白の問題ですか?入れ子IF/ELSEとELIFの違いは?
if something:
...
else:
if other:
...
else:
...
対。
if something:
...
elif other:
...
else:
...
これらの2つの異なるコード組織の間に意味またはランタイムの違いはありますか?それとも、単に簡潔さと空白の問題ですか?入れ子IF/ELSEとELIFの違いは?
if something:
...
else:
if other:
...
else:
...
対。
if something:
...
elif other:
...
else:
...
論理的な違いはありません。第二の方法を好む、それはより読みやすいです。抽象構文レベルで、それらは正確に等価であること
注:具体的には、第二のフォームが最初のフォームに変換されます
>>> 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
両方が同じバイトコードにコンパイルされ(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の変種はより清潔であり、好ましいものでなければならない。
Pythonはすべてコードの可読性に関するものです。あなたはそれがPythonのもっと多くの場合にあることがわかります。 Pythonは「Less is Better」というコンセプトに従います。 あなたが聞いた質問について話すなら、逃げやすさを除いて2つの形式に違いはありません。
ええと、なぜdownvote? – arshajii
ここでバイトコードは無関係です(そしてCPython実装の詳細)。これらは、解析/レックス段階の後で既に同等です。 – wim
@wimだから何?私は、2人が最終的に同じ結果を生み出すことを証明しようとしています。 – arshajii