23

以下哪个 if 语句更符合 Python 风格?

if not a and not b:
    do_something

或者

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        
4

6 回答 6

15

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

not any((a, b))

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

于 2012-10-22T13:51:54.563 回答
15

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

于 2012-10-22T13:28:14.323 回答
3

使用哪个?对于您正在尝试做的事情,哪个更具可读性。

至于哪个效率更高,第一个确实做了额外的not工作,因此在技术上效率较低,但在正常情况下您不会注意到。

于 2012-10-22T13:29:53.060 回答
1

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

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

于 2012-10-22T13:28:47.210 回答
1

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

如果 a 然后 b:做某事

如果 a 和 b:做某事

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

或等价物是“或其他”

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

和/或渴望。

然后/或将评估短路

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

于 2012-10-22T14:19:12.257 回答
0

对于一段 Pythonic 的代码,它必须本身(可读)和在其周围环境中(一致)都令读者感到愉悦。如果没有这段代码的上下文,很难给出好的意见。

但是,另一方面......如果我在我看来是 Pythonic,我需要与我的环境一致地操作,这似乎没有考虑到上下文(例如 OP)。

最上面的一个。

于 2013-04-18T03:50:51.983 回答