python "elif" 的编译方式是否与 else: if 不同?
Is the python "elif" compiled differently from else: if?
我知道在 C、C++、Java 和 C# 等语言中,(C# example)else if
语句是语法糖,因为它实际上只是一个 else
语句后跟 if
语句。
else if (conition(s)) { ...
等于
else {
if (condition(s)) { ...
}
但是,在python中,有一个特殊的elif
声明。我一直想知道这是否只是 shorthand 对开发人员而言,或者是否有一些隐藏的优化 python 可以因此而做,例如更快地解释?但这对我来说没有意义,因为那时其他语言也会这样做(例如 JavaScript)。所以,我的问题是,python 中的 elif
语句只是 shorthand 供开发人员使用,还是有一些隐藏的东西可以通过这样做获得?
elif
in Python 是 else if
的语法糖,在许多其他语言中都可以看到。就这些了。
关键字“elif”是“else if”的缩写,有助于避免过度缩进。Source
当你真的想知道解释器在幕后发生了什么时,可以使用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
看起来我们的两个函数使用相同的字节码 -- 显然它们是等价的。
不过要小心,字节码是 CPython 的一个实现细节——没有人会说 所有 python 实现在幕后做同样的事情——一切都很重要是他们有相同的行为。通过逻辑,您可以说服自己 f1
和 f2
应该做同样的事情,无论底层实现是否将其视为 "syntatic sugar" 或者是否有更复杂的事情发生。
以下三个代码片段都将使用相同的逻辑执行,但都使用不同的语法。
elif condition: ...
else if conition { ...
else {
if conition { ...
}
Python 的 elif
只是普通 else if
语句
的语法糖
我知道在 C、C++、Java 和 C# 等语言中,(C# example)else if
语句是语法糖,因为它实际上只是一个 else
语句后跟 if
语句。
else if (conition(s)) { ...
等于
else {
if (condition(s)) { ...
}
但是,在python中,有一个特殊的elif
声明。我一直想知道这是否只是 shorthand 对开发人员而言,或者是否有一些隐藏的优化 python 可以因此而做,例如更快地解释?但这对我来说没有意义,因为那时其他语言也会这样做(例如 JavaScript)。所以,我的问题是,python 中的 elif
语句只是 shorthand 供开发人员使用,还是有一些隐藏的东西可以通过这样做获得?
elif
in Python 是 else if
的语法糖,在许多其他语言中都可以看到。就这些了。
关键字“elif”是“else if”的缩写,有助于避免过度缩进。Source
当你真的想知道解释器在幕后发生了什么时,可以使用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
看起来我们的两个函数使用相同的字节码 -- 显然它们是等价的。
不过要小心,字节码是 CPython 的一个实现细节——没有人会说 所有 python 实现在幕后做同样的事情——一切都很重要是他们有相同的行为。通过逻辑,您可以说服自己 f1
和 f2
应该做同样的事情,无论底层实现是否将其视为 "syntatic sugar" 或者是否有更复杂的事情发生。
以下三个代码片段都将使用相同的逻辑执行,但都使用不同的语法。
elif condition: ...
else if conition { ...
else {
if conition { ...
}
Python 的 elif
只是普通 else if
语句