编写条件语句的更简单方法

Easier way to write conditional statement

有没有更漂亮的方法来编写这个 if 语句:

if not (self.is_legal(l) or self.is_legal(u) or self.is_legal(r) or self.is_legal(d)):

我已经试过了,但是没用。

if not self.is_legal(l or r or d or u):

或者第一个是最漂亮的?

您可以使用 any and a generator expression:

if not any(self.is_legal(x) for x in (l, u, r, d)):

或者,如果您更喜欢 all 而不是 any

if all(not self.is_legal(x) for x in (l, u, r, d)):

不过,第一个解决方案似乎读起来更好一些。


至于为什么您尝试的解决方案不起作用,Python 中的 or 运算符的行为与您认为的不同。来自 docs:

The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.

所以,self.is_legal(l or r or d or u) 只是将第一个真值传递给 self.is_legal 方法,而不是所有的值。

您可以使用元组或集合:

if False in (self.is_legal(l), self.is_legal(u), self.is_legal(r), self.is_legal(d)):

if {False} <= {self.is_legal(l), self.is_legal(u), self.is_legal(r)}:

进一步扩展这个想法:

if {False} <= {self.is_legal(var) for var in (l, u, r, d)}: 

或者使用空列表或集合或任何错误的事实:

if [var for var in (l, u, r, d) if self.is_legal(var) is False]:

我想这完全取决于您认为的 "pretty"。

Python 中的空列表是错误的。

您可以生成一个带有理解和条件的空列表,如下所示:

>>> def is_legal(x):
...    return x>5
... 
>>> bool([x for x in (1,2,3,4) if is_legal(x)])
False
>>> bool([x for x in (1,2,3,4,6) if is_legal(x)])
True