有没有更好的方法来编写这个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):
或者第一个可能是最漂亮的?
答案 0 :(得分:12)
您可以使用any
和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:
表达式
x or y
首先评估x
;如果x
为真,则为其值 被退回;否则,将评估y
,结果值为 返回。
所以,self.is_legal(l or r or d or u)
只是将第一个真值传递给self.is_legal
方法,而不是全部。
答案 1 :(得分:0)
您可以使用元组或集:
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]:
我猜这一切都取决于你认为“漂亮”的东西。
答案 2 :(得分:0)
Python中的空列表为false。
您可以生成一个带有理解和条件的空列表,如下所示:
>>> 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