这两个不同的代码组织之间是否存在语义或运行时差异?或者仅仅是简洁和空白的问题?
if something:
...
else:
if other:
...
else:
...
Vs以上。
if something:
...
elif other:
...
else:
...
答案 0 :(得分: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
答案 1 :(得分: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)
Python完全是关于代码的可读性。你可以在更多的python案例中找到它。 Python遵循" Less is Better"的概念。 如果我们谈到您提出的问题,除了可重复性之外,两种格式之间没有这种差异。