您可以使用不等于或等于Python的方式简化链式比较吗?

时间:2018-09-27 07:21:15

标签: python

可能有些人可能认为这是重复的,是的,我发现了很多类似的示例: enter image description here

但是Pycharm说我可以这样:

if y > x and x != -1:
    #  do something

我进行了一些搜索,但找不到相似的内容。 我的问题是像这样简化此功能是否正确:

if y > x != -1:
    #  do something

如果这样的话,它是否安全?除了较短的版本,此版本与非简化版本之间是否有任何区别? 如果不是简化它的正确方法,那是什么?

1 个答案:

答案 0 :(得分:3)

这在功能上是等效的,但是在以下情况下:

function Validation(result, res){
if(result.error){
    //422 Validation Error
    var objError = [];    
    Object.keys(result.error.details).forEach(function(key) {
        objError.push(result.error.details[key]['message']);
    });
    return res.status(422).json(objError);
}

易于阅读,混合使用不同的运算符以使用链式比较不是最佳选择。

真的一样吗?让我们反汇编一下:

10 < x < 40

结果:

def f1(x,y):
    if y > x and x != -1:
        return 0

def f2(x,y):
    if y > x != -1:
        return 0

import dis

print("function 1")
dis.dis(f1)
print("function 2")
dis.dis(f2)

令人惊讶的是它们并不相同,并且链接的版本具有更多说明。

不知道这里发生了什么(有些花了一些时间来更好地解释它:Python Documentation#raise),但实际上我会坚持使用function 1 2 0 LOAD_FAST 1 (y) 3 LOAD_FAST 0 (x) 6 COMPARE_OP 4 (>) 9 POP_JUMP_IF_FALSE 28 12 LOAD_FAST 0 (x) 15 LOAD_CONST 3 (-1) 18 COMPARE_OP 3 (!=) 21 POP_JUMP_IF_FALSE 28 3 24 LOAD_CONST 2 (0) 27 RETURN_VALUE >> 28 LOAD_CONST 0 (None) 31 RETURN_VALUE function 2 6 0 LOAD_FAST 1 (y) 3 LOAD_FAST 0 (x) 6 DUP_TOP 7 ROT_THREE 8 COMPARE_OP 4 (>) 11 JUMP_IF_FALSE_OR_POP 23 14 LOAD_CONST 3 (-1) 17 COMPARE_OP 3 (!=) 20 JUMP_FORWARD 2 (to 25) >> 23 ROT_TWO 24 POP_TOP >> 25 POP_JUMP_IF_FALSE 32 7 28 LOAD_CONST 2 (0) 31 RETURN_VALUE >> 32 LOAD_CONST 0 (None) 35 RETURN_VALUE >>> 版本,该版本具有快捷方式并且可读性强(请考虑一下)未来的维护者...)。

也就是说,关于链式比较的一件有趣的事情是,如果计算中心参数/花费较长时间进行计算/在计算中产生副作用,而又不想将其存储在变量中:

and

在这种情况下,中心参数仅计算一次。如果是if y > super_long_computation(x) != -1: ,则必须事先存储。