Python Conditionals中的括号

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的单独调用,并且可以在项目增长时更轻松地添加其他可能的有效值,或者您必须授权其他主机.

  • @TheGodfather - 请原谅?语句“比较发生在布尔值之前”解释了在这种情况下没有必要使用这些括号。然后它继续提供一个更清晰、更易读的实现。这也已经被接受了近 9 年了。 (4认同)
  • 这并没有回答有关 Python 条件中括号(!) 使用的问题 (2认同)

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中)说过这样的话:

  1. 首先是乘法和除法
  2. 接下来加法和减法
  3. 括号围绕其他一切

(是的,IIRC他们没有取代指数!)

我们的想法是,优先级规则足够晦涩,以至于没有人应该记住它们,原始程序员和维护程序员都不会记住它们,因此最好将其明确化.本质上,括号既用于将意图传达给编译器,也用作下一个必须处理它的schmoe的文档.

我相信Python这两个语句会产生相同的字节码,所以你甚至不会失去任何效率.

  • 但也有python成语"明确比隐含更好".如果有混淆的可能性,请坚持下去. (2认同)
  • 是的,C比Python更怪异.尽管如此,试图在他们使用的各种语言中保持他们的直接可能本身就是混乱的根源. (2认同)

The*_*her 8

我一直认为这是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会更具可读性,但这现在已经偏离主题了)