Ben*_*ing 29 python conditional parentheses
关于在Python条件语句中使用括号,我有一个简单的问题.
以下两个片段的工作方式相同,但我想知道这是否真实,因为它的简单性;
>>> import os, socket
>>> if ((socket.gethostname() == "bristle") or (socket.gethostname() == "rete")):
... DEBUG = False
... else:
... DEBUG = True
...
>>> DEBUG
Run Code Online (Sandbox Code Playgroud)
现在没有括号
>>> import os, socket
>>> if socket.gethostname() == "bristle" or socket.gethostname() == "rete":
... DEBUG = False
... else:
... DEBUG = True
...
>>> DEBUG
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮忙解释一下吗?他们在任何情况下我都应该使用它们吗?
g.d*_*d.c 39
在布尔值之前进行比较的另一个答案是100%正确.作为替代方案(对于您所演示的情况),您也可以将其用作组合条件的方法:
if socket.gethostname() in ('bristle', 'rete'):
# Something here that operates under the conditions.
Run Code Online (Sandbox Code Playgroud)
这样可以节省对socket.gethostname的单独调用,并且可以在项目增长时更轻松地添加其他可能的有效值,或者您必须授权其他主机.
Jam*_*mes 13
括号只是强制执行操作.如果您在条件中有一个额外的部分,例如'和',则建议使用括号来表示哪个'或'那'和'配对.
if (socket.gethostname() == "bristle" or socket.gethostname() == "rete") and var == condition:
...
Run Code Online (Sandbox Code Playgroud)
区别于
if socket.gethostname() == "bristle" or (socket.gethostname() == "rete" and var == condition):
...
Run Code Online (Sandbox Code Playgroud)
kin*_*all 10
在这种情况下,括号是多余的.比较具有比布尔运算符更高的优先级,因此无论括号如何,都将首先执行比较.
也就是说,我曾经看过的一个指南(可能在Practical C Programming中)说过这样的话:
(是的,IIRC他们没有取代指数!)
我们的想法是,优先级规则足够晦涩,以至于没有人应该记住它们,原始程序员和维护程序员都不会记住它们,因此最好将其明确化.本质上,括号既用于将意图传达给编译器,也用作下一个必须处理它的schmoe的文档.
我相信Python这两个语句会产生相同的字节码,所以你甚至不会失去任何效率.
我一直认为这是PEP8 的一部分,但显然不是。但是,在 PEP、代码示例和文档中遇到的所有示例中,您永远不会看到多余的括号(例如,在 PyCharm 中甚至有这样的检查)。
一般建议是仅在提高可读性或您确实想要更改表达式计算顺序(例如(a or b) and c)时才使用括号。
做:
if (first_expr or second_expr) and third_expr:
if first_expr or second_expr:
Run Code Online (Sandbox Code Playgroud)
不要:
if ((first_expr or second_expr) and third_expr):
if (first_expr):
if (first_expr or (second_expr and third_expr)):
Run Code Online (Sandbox Code Playgroud)
在您的代码示例中,括号是完全多余的,只需使用即可if socket.gethostname() == "bristle" or socket.gethostname() == "rete":(当然,在生产代码中in会更具可读性,但这现在已经偏离主题了)