以下哪个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
答案 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)。
排名第一。