逻辑运算符替换if语句

Scr*_*ffy 8 python pep8 logical-operators

以下是使用符合Pythonic/pep8的逻辑表达式吗?

  1. 这个:

    x = a or b
    
    Run Code Online (Sandbox Code Playgroud)

    代替:

    if not a:
        x = b
    else:
        x = a
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这个:

    x = a and b
    
    Run Code Online (Sandbox Code Playgroud)

    代替:

    if not a:
        x = a
    else:
        x = b
    
    Run Code Online (Sandbox Code Playgroud)
  3. (曲线球?)这个:

    x = x or y
    
    Run Code Online (Sandbox Code Playgroud)

    代替:

    if not x:
        x = y
    
    Run Code Online (Sandbox Code Playgroud)

Vik*_*kez 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

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

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

  • 实际上,我认为这些简短形式比明确的`if`块更好. (3认同)
  • 我绝对认为3.应该是`x = x或y`而不是三元组. (2认同)
  • 对我来说,`x = x if x else y`比if语句更难阅读. (2认同)

Ble*_*der 1

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

在很多情况下,短路逻辑“或”都可以派上用场。这是Requests源代码中的一个简单代码:

cookies = request.cookies or {}
Run Code Online (Sandbox Code Playgroud)

这段代码的结果应该是什么是显而易见的,因为它读起来就像一个句子。这并不是说详细版本不可读:

cookies = request.cookies if request.cookies else {}
Run Code Online (Sandbox Code Playgroud)

和:

cookies = {}

if request.cookies:
    cookies = request.cookies
Run Code Online (Sandbox Code Playgroud)

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

d.get('key', 'fallback')
Run Code Online (Sandbox Code Playgroud)