编写条件语句的更简单方法
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
有没有更漂亮的方法来编写这个 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 evaluatesx
; ifx
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