【问题标题】:logical operators replacing if statements替换 if 语句的逻辑运算符
【发布时间】:2013-08-18 14:01:07
【问题描述】:

以下逻辑表达式的用法是否符合 Pythonic / pep8 标准?

  1. 这个:

    x = a or b
    

    代替:

    if not a:
        x = b
    else:
        x = a
    
  2. 这个:

    x = a and b
    

    代替:

    if not a:
        x = a
    else:
        x = b
    
  3. (曲线球?)这个:

    x = x or y
    

    代替:

    if not x:
        x = y
    

【问题讨论】:

  • 我不认为 PEP8 指定了这种事情。我的意见:第二个版本更具可读性,因此更可取。不要让我思考。
  • 1 和 3 很简单,也很常用(虽然我不确定 3),但是 2 花了我几秒钟的时间阅读,所以我可能不会使用它。
  • “可读性很重要”。不管它们中的任何一个对于相对有经验的 Python 程序员来说是多么容易阅读,我认为它们可能会使任何来自逻辑运算符返回布尔值的语言的人感到困惑。
  • 如果 1 和 2 是非pythonic,andor 将得到布尔结果,因为这是它们当前行为的唯一应用
  • @Scruffy: node.get('y', False) 更直接。

标签: python logical-operators pep8


【解决方案1】:

PEP 8 与您使用逻辑运算符的方式无关。

假设使用逻辑运算符而不是条件语句的动机很简洁,那么使用三元运算符会更好:

  1. x = a if a else b 而不是x = a or b

  2. x = b if a else a 而不是x = a and b

  3. x = x if x else y 或只是if not x: x = y 而不是x = x or y

但也没有人禁止您使用其他版本。这都是一米的个人意见。引入三元运算符的动机是避免使用andor 运算符(请参阅PEP 308)实现相同效果的容易出错的尝试。它们还可以在列表推导中启用花哨的东西,以及其他一些东西。

引入它们不是为了替换复杂的 if 语句,而是作为 pythonic 三元运算符:x if condition else y

【讨论】:

  • 实际上,我认为这些简短的形式比明确的 if 块更好。
  • 我绝对认为 3. 应该是x = x or y 而不是三元组。
  • 对我来说,x = x if x else y 比 if 语句更难阅读。
  • @viktorkerkez if not x: x = y 被 pep8 劝阻。
  • @Scruffy:这真的取决于上下文。三元运算符无法处理像x = a() or b() 这样的情况,因为您必须调用a 两次或将结果存储在变量中。只需使用常识,不要力求写出最复杂的单行代码。
【解决方案2】:

与 C 和 Java 不同,Python 的逻辑运算符不返回布尔值。除了您的问题之外,我无法想象该语言功能的另一个用例,因此除非语言设计者不加思索地添加功能,否则它是 Pythonic(#3 除外)。

在许多情况下,短路逻辑 OR 可用于您的优势。下面是Requests源代码中的一个简单的:

cookies = request.cookies or {}

这段代码的结果应该是什么一目了然,因为它读起来像一个句子。现在这并不是说冗长的版本不可读:

cookies = request.cookies if request.cookies else {}

还有:

cookies = {}

if request.cookies:
    cookies = request.cookies

但它们是多余的。 Python 对字典使用相同的语法来防止相同的冗余:

d.get('key', 'fallback')

【讨论】:

  • 我将我接受的答案更改为这个答案,因为问题是它是否是“Pythonic”。
【解决方案3】:

我不认为 pep8 涵盖了这一点,但对我来说,在您的示例中,if 语句看起来比逻辑运算符更具可读性(尤其是对于 Python 新手(因此由于“可读性计数”而更具 Pythonic) , 看起来仍然比三元运算符更 Pythonic。

但是,三元运算符肯定比condition and true_value or false_value(false_value, true_value)[condition] 等更好,因为它更具可读性并且不太可能中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多