Python 是德摩根';什么是蟒蛇法?

Python 是德摩根';什么是蟒蛇法?,python,pep8,demorgans-law,Python,Pep8,Demorgans Law,以下哪个if语句更像python if not a and not b: do_something 或 它不是谓词逻辑,所以我应该使用Python关键字,因为它更可读,对吗 在后一个解决方案中比另一个更优?(我不这么认为。) 这方面有PEP-8指南吗 两种方法的字节码(如果重要): 我会说哪个更容易阅读,取决于a和b是什么。它们是等价的,一个比另一个快取决于环境(a和b的值) 因此,只需选择您认为最可读和/或可理解的版本。使用哪个版本?无论你想做什么,哪一个更具可读性 至于哪一个更有效

以下哪个if语句更像python

if not a and not b:
    do_something

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

在后一个解决方案中比另一个更优?(我不这么认为。)

这方面有PEP-8指南吗

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


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

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


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

使用哪个版本?无论你想做什么,哪一个更具可读性


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

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

not any((a, b))

因为对我来说,这读起来更像英语,因此是最具python风格的。

我个人喜欢埃菲尔法,把它变成python风格

如果是a,然后是b: 剂量

如果a和b: 剂量

如果a为false,则第一种方法与第二种方法不同。在第一种情况下它不计算b,在第二种情况下它计算b

或等效项为“或其他”

和/或渴望

然后/或使评估短路


语法的好处在于它可读性好,并且不会引入新的关键字

一段代码要想成为Pythonic,它必须既能让读者满意(可读),又能让读者满意(一致)。没有这段代码的上下文,很难给出好的意见

但是,另一方面。。。如果我认为自己是个蟒蛇,那么我需要与周围环境保持一致,而周围环境似乎没有考虑上下文(例如OP)


顶部。

你的意思是技术上更高效。是的,在这个笔记本电脑屏幕上,我无法立即看到问题和答案。我修好了。:-)我们被指示更改许多代码,因为有人认为后者更具可读性。它的Python2.6版本,因此any和all函数可以用于更复杂的语句,但是当比较两个项时,这就很重要了。我认为第一个比较容易,但我没有理由说另一个不是。大量的代码更改和单元测试要运行!!很多时候,像这样的东西更受欢迎;或者有时候你需要遵循已有的惯例。如果您使用的是共享代码库,并且有一些人更喜欢其中一个,那么我会遵循惯例。它使整个代码库更加连贯。使用Python关键字是什么意思?您在这两种情况下都使用Python关键字。抱歉,我指的是not()语法。在我的例子中,如果我不使用(a或b)语法,有些东西看起来会更糟。因此我更倾向于第一段代码我倾向于认为“do_something”和“do something”(无下划线)可能是不同的这是关于什么是最“Pythonic”的,包括字节码似乎很奇怪。。。另外,
a
b
可能包括函数调用+我想我从来没有在我的代码中使用过这种模式,我也无法解释为什么。诚然,我倾向于尽可能避免
((
),但这并不太糟糕。不过,这将充分评估
a
b
,而常规布尔运算符不会。这不是不使用它的理由,而是需要注意的一点。在Python中,通过添加或乘以布尔值,可以获得与“渴望”操作符大致相同的效果。e、 g.
bool(a)+bool(b)
是“急切的”
(总是同时计算
a和
b
)和
bool(a)*bool(b)
是“急切的”
。当然,通常的
短路。
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        
not any((a, b))