逻辑运算符替代if语句

8
以下逻辑表达式的使用是否符合Pythonic / pep8标准?
  1. This:

    x = a or b
    

    instead of:

    if not a:
        x = b
    else:
        x = a
    
  2. This:

    x = a and b
    

    instead of:

    if not a:
        x = a
    else:
        x = b
    
  3. (The curve-ball?) This:

    x = x or y
    

    instead of:

    if not x:
        x = y
    

1
1和3很直接并且常用(虽然我不确定3),但是2花了我几秒钟才读懂,所以我可能不会使用它。 - Blender
1
"可读性至关重要". 不管对于相对有经验的Python程序员来说,它们中的任何一个都很容易阅读,但我认为它们可能会让那些来自逻辑运算符返回布尔值的语言的人感到困惑。 - rlms
2
如果1和2不符合Python规范,那么andor将具有布尔结果,因为这是它们当前行为的唯一应用。 - Eric
对于问题#2,考虑一个布尔型的XML属性:attr = node.hasAttr('y') and node.getAttr('y') == 'True' - Scruffy
1
@Scruffy:node.get('y', False) 更加简单明了。 - Blender
显示剩余6条评论
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

但是没有人禁止您使用其他版本。这完全是个人观点的问题。引入三元操作符背后的动机是为了避免使用andor运算符(参见PEP 308)时容易出错的尝试。它们还可以在列表理解中实现花式操作,以及其他一些功能。

它们并不是为了取代复杂的if语句,而是作为一个“pythonic”的三元操作符:x if condition else y


3
实际上,我认为这些缩写形式并不比明确的 if 代码块更好。 - user395760
2
我认为第三个应该是 x = x or y 而不是三元运算符。 - Scruffy
2
对我来说,“x = x if x else y”比只使用if语句更难理解。 - rlms
@Scruffy 我同意。我只是把它写成一行,因为如果我添加多行代码块,SO markdown语法中的枚举会中断 :) - Viktor Kerkez
1
@Scruffy:这真的取决于上下文。三元运算符无法处理像 x = a() or b() 这样的情况,因为你必须调用 a 两次或将结果存储在变量中。只需运用常识,不要努力编写最复杂的一行代码。 - Blender
显示剩余7条评论

1
与C和Java不同,Python的逻辑运算符不返回布尔值。除了你问题中提到的用例外,我无法想象其他语言功能的用途,因此,除了#3之外,如果语言设计者没有考虑加入功能,它就是Pythonic的。
有许多情况下,短路逻辑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”的。 - Scruffy

1
我认为pep8没有涵盖这一点,但在你的例子中,if语句看起来更易读(特别是对于新手来说更具有Pythonic的“可读性计数”),比逻辑运算符更Pythonic,而三元运算符则更好。然而,相对于“condition and true_value or false_value”,“(false_value, true_value)[condition]”等,三元运算符肯定更易读且不太可能出错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接