8

以下逻辑表达式的使用是否符合 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
    
4

3 回答 3

5

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

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

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

于 2013-08-18T14:06:32.793 回答
1

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

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

于 2013-08-18T14:17:46.917 回答
1

与 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')
于 2013-08-18T15:29:09.140 回答