德摩根定律是Pythonic吗?

问题描述 投票:0回答:6

以下哪个 if 语句更 Pythonic?

if not a and not b:
    do_something

if not (a or b):
    do something

这不是谓词逻辑,所以我应该使用 Python 关键字,因为它更具可读性,对吧?

后一个解决方案是否比另一个解决方案更优化? (我不相信是这样。)

有这方面的 PEP-8 指南吗?

两种方法的字节代码(如果重要的话):

def func1():
    if not a and not b:
        return   
    
def func2():
    if not (a or b):
        return
In [49]: dis.dis(func1)
  2           0 LOAD_GLOBAL              0 (a)
              3 UNARY_NOT           
              4 JUMP_IF_FALSE           13 (to 20)
              7 POP_TOP             
              8 LOAD_GLOBAL              1 (b)
             11 UNARY_NOT           
             12 JUMP_IF_FALSE            5 (to 20)
             15 POP_TOP             

  3          16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        
        >>   20 POP_TOP             
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE        

In [50]: dis.dis(func2)
  2           0 LOAD_GLOBAL              0 (a)
              3 JUMP_IF_TRUE             4 (to 10)
              6 POP_TOP             
              7 LOAD_GLOBAL              1 (b)
        >>   10 JUMP_IF_TRUE             5 (to 18)
             13 POP_TOP             

  3          14 LOAD_CONST               0 (None)
             17 RETURN_VALUE        
        >>   18 POP_TOP             
             19 LOAD_CONST               0 (None)
             22 RETURN_VALUE        
python pep8 demorgans-law
6个回答
15
投票

我会说哪个对你来说更容易阅读,具体取决于 a 和 b 是什么。


15
投票

我认为你的两个例子都具有同样的可读性,但是如果我想在可读性上“把船推出去”,我会选择:

not any((a, b))

对我来说,这读起来更像英语,因此是最 Pythonic 的。


3
投票

使用哪个?对于您想要做的事情,哪个更具可读性。

至于哪个效率更高,第一个确实做了额外的

not
,所以技术上效率较低,但在正常情况下你不会注意到。


1
投票

它们是等价的,一个是否比另一个快取决于情况(a和b的值)。

因此,只需选择您认为最可读和/或最容易理解的版本即可。


1
投票

我个人喜欢 Eiffel 方法,放入 pythonic 形式

如果a然后b: 做某事

如果a和b: 做某事

如果 a 为假,第一种方法与第二种方法不同。在第一种情况下它不会评估 b,在第二种情况下它会评估 b。

或等价物是“否则”

http://en.wikipedia.org/wiki/Short- Circuit_evaluation

和/或渴望。

然后/或者短路评估

语法的好处是它读起来很好,并且不会引入新的关键字。


0
投票

一段代码要具有 Python 风格,它本身必须让读者满意(可读),并且与周围环境的上下文一致(一致)。如果没有这段代码的上下文,很难给出好的意见。

但是,另一方面......如果我认为我是Pythonic,那么我需要与我的周围环境保持一致,这似乎没有考虑上下文(例如OP)。

最上面那一张。

© www.soinside.com 2019 - 2024. All rights reserved.