写条件性陈述的简单方法

2024-03-29 11:32:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

或者第一个是最漂亮的?你知道吗


Tags: or方法selfifisnot语句legal
3条回答

可以使用^{}generator expression

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

或者,如果您喜欢^{}而不是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)只是将第一个truthy值传递给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]:

我想这完全取决于你认为什么是“漂亮的”。你知道吗

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

相关问题 更多 >