逻辑运算符替换if语句

时间:2013-08-18 14:01:08

标签: python logical-operators pep8

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
    

3 个答案:

答案 0 :(得分: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

  4. 但是没有人禁止你使用其他版本。这一切都是个人观点。引入三元运算符背后的动机是避免使用andor运算符实现相同效果的容易出错的尝试(请参阅PEP 308)。它们还可以在列表推导中实现花哨的东西,以及更多的东西。

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

答案 1 :(得分:1)

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

然而,三元运算符肯定比condition and true_value or false_value(false_value, true_value)[condition]等更好,因为它更易读,更不容易破解。

答案 2 :(得分: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')