我有一个关于在Python条件语句中使用括号的简单问题。
以下两个片段的工作方式相同,但我想知道这是否属实,因为它的简单性;
>>> import os, socket
>>> if ((socket.gethostname() == "bristle") or (socket.gethostname() == "rete")):
... DEBUG = False
... else:
... DEBUG = True
...
>>> DEBUG
现在没有括号
>>> import os, socket
>>> if socket.gethostname() == "bristle" or socket.gethostname() == "rete":
... DEBUG = False
... else:
... DEBUG = True
...
>>> DEBUG
有人能帮忙解释一下吗?他们在任何情况下都应该使用它们吗?
答案 0 :(得分:36)
在布尔值之前进行比较的其他答案是100%正确的。作为替代方案(对于您所演示的情况),您也可以将其用作组合条件的方法:
if socket.gethostname() in ('bristle', 'rete'):
# Something here that operates under the conditions.
这样可以节省对socket.gethostname的单独调用,并且可以在项目增长时更容易添加其他可能的有效值,或者您必须授权其他主机。
答案 1 :(得分:9)
在这种情况下,括号是多余的。比较具有比布尔运算符更高的优先级,因此无论括号如何,都将首先执行比较。
那就是说,我曾经看过的指南(也许是 Practical C Programming)这样的话:
(是的,IIRC他们没有取代指数!)
这个想法是,优先规则足够晦涩,以至于没有人应该记住它们,原始程序员和维护程序员都不会记住这些规则,因此最好将其明确化。本质上,括号既用于将意图传达给编译器,也用作下一个必须处理它的schmoe的文档。
我相信Python这两个语句会产生相同的字节码,所以你甚至不会失去任何效率。
答案 2 :(得分:7)
括号只是强制执行操作。如果您在条件中有一个额外的部分,例如'和',则建议使用括号来表示哪个'或'那'和'配对。
if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
...
区别于
if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
...
答案 3 :(得分:2)
在Python和许多其他编程语言中,每个具有多个运算符的表达式都不需要括号。这是因为运营商具有定义的优先级。有关Python中运算符优先级的信息,请参阅表here(第5.15节)。
你可以用算法来比喻。这些表达式是等价的:
5 * 5 + 3
(5 * 5) + 3
如果你想先添加三个,那么你需要使用这样的括号:
5 * (5 + 3)
答案 4 :(得分:0)
看看the manual。您在列表中的位置越高,稍后将应用运算符。 “或”在“==”之上,因此,在这种特殊情况下,答案是相同的。但是,为了便于阅读,我建议使用括号。
答案 5 :(得分:0)
我一直以为这是PEP8的一部分,但显然不是。但是,在PEP,代码示例和文档中遇到的所有示例中,您都不会看到多余的括号(例如,在PyCharm中甚至进行了这种检查)。
一般建议仅在提高可读性或您实际上要更改表达式计算的顺序(例如(a or b) and c
)时才使用括号。
要做:
if (first_expr or second_expr) and third_expr:
if first_expr or second_expr:
不要:
if ((first_expr or second_expr) and third_expr):
if (first_expr):
if (first_expr or (second_expr and third_expr)):
在您的代码示例中,括号是完全多余的,只需使用if socket.gethostname() == "bristle" or socket.gethostname() == "rete":
(当然,在生产代码中,in
将更具可读性,但是现在已经不那么重要了)