以下哪个如果语句是Pythonic?
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
我会说,根据A和B是什么,您更容易阅读。
我认为您的两个示例都是同样可读的,但是,如果我想"将船推出",我会使用:
not any((a, b))
既然对我来说更像英语,因此是最PYTHONIC。
使用哪个?
关于哪个更有效,第一个确实会做额外的not
,因此在技术上效率较低,但您在正常情况下会注意到。
它们是等效的,并且一个是否比另一个更快取决于情况(a和b的值)。
。因此,只需选择最可读和/或可理解的版本即可。
我个人喜欢艾菲尔方法,放入Pythonic Form
如果A然后B: dosomething
如果a和b: dosomething
如果a为false,则第一个方法与第二种方法有所不同。在第一种情况下,它不会在第二个情况下评估B。
或等效的是"否则"
http://en.wikipedia.org/wiki/short-circuit_evaluation
和/或渴望。
,然后/否则/或短路评估
语法的好处是它的读数很好,并且不会引入新的关键字。
要使一件代码为Pythonic,它必须让读者本身(可读)和周围环境(一致)对读者感到满意。如果没有这个代码的背景,就很难发表好意见。
但是,另一方面……如果我认为我是pythonic,我将需要与周围的环境保持一致,这似乎并没有考虑到上下文(例如OP)。
顶部。