更容易编写条件语句的方法

时间:2015-04-04 18:30:21

标签: python if-statement conditional-statements

有没有更好的方法来编写这个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):

或者第一个可能是最漂亮的?

3 个答案:

答案 0 :(得分:12)

您可以使用anygenerator 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