【问题标题】:Easier way to write conditional statement编写条件语句的更简单方法
【发布时间】:2015-06-09 14:15:31
【问题描述】:

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

或者也许第一个是最漂亮的?

【问题讨论】:

    标签: python if-statement conditional-statements


    【解决方案1】:

    您可以使用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 方法,而不是全部。

    【讨论】:

    • 太棒了!是的,我试图使用任何/全部,但没有考虑添加。谢谢!
    • 你的意思是如果self.is_legal 是一个 lambda 函数?当然,这将与我发布的内容相同。 Lambda 就像普通函数一样,可以在任何可以调用的地方调用。
    • 是的,这就是我的意思。非常感谢。祝你有美好的一天,复活节快乐!
    【解决方案2】:

    你可以使用元组或集合:

    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]:
    

    我想这一切都取决于你认为什么是“漂亮”。

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 2011-05-10
        • 2021-12-15
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 2012-10-20
        • 2015-03-22
        • 2020-09-28
        相关资源
        最近更新 更多