De Morgan的法则是Pythonic吗?

时间:2012-10-22 13:25:53

标签: python pep8 demorgans-law

以下哪个if语句更像Pythonic?

if not a and not b:
    do_something

OR

if not ( a or b ):
    do something

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

在后面的解决方案中比另一个更优化? (我不相信。)

这是否有任何PEP-8指南?

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

In [43]: def func1():
    if not a and not b:
        return
   ....:     
   ....:     

In [46]: 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        

6 个答案:

答案 0 :(得分:15)

我会说更容易阅读的内容,具体取决于a和b是什么。

答案 1 :(得分:15)

我认为你的两个例子都具有同等的可读性,但如果我想在可读性方面“推开船”,我会选择:

not any((a, b))

从我这看起来更像英语,因此是最恐怖的。

答案 2 :(得分:3)

使用哪个?无论你想要做什么都更具可读性。

至于哪一个更有效率,第一个确实做了额外的not因此在技术上效率较低,但在正常情况下你并没有注意到。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

我个人喜欢埃菲尔方式,投入pythonic形式

如果a然后b:     DoSomething的

如果a和b:     DoSomething的

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

或等同于“或者”

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

和/或渴望。

然后/或者将评估短路

语法的好处在于它读得很好,而且它没有引入新的关键字。

答案 5 :(得分:0)

对于一段代码是Pythonic,它本身(可读)和周围环境(一致)都必须令读者满意。没有这段代码的背景,很难给出好的意见。

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

排名第一。