Python bitand(&)vs和

时间:2013-03-06 15:17:56

标签: python bitwise-operators logical-and

大家好我有这部分代码:

for line in response.body.split("\n"):
    if line != "": 
        opg = int(line.split(" ")[2])
        opc = int(line.split(" ")[3])
        value = int(line.split(" ")[5])
        if opg==160 & opc==129:
            ret['success'] = "valore: %s" % (value)
            self.write(tornado.escape.json_encode(ret))

我有一个类型为

的系列
1362581670        2459546910990453036    156     0     30      0

我想只取第三和第四个元素分别为160和129的行。 此代码不起作用。我需要做一些演员吗?我认为opg == 160正在使用int ...

进行campare int

3 个答案:

答案 0 :(得分:5)

你对运营商感到困惑; and is the correct boolean test&代替binary bitwise operator

if opg == 160 and opc == 129:

作为数字运算符,&运算符具有higher precedence than comparison operators,而布尔运算符的优先级较低。因此,opg == 160 & opc == 129表达式被解释为opg == (160 & opc) == 129,这可能不是您想要的。

您可以稍微简化一下代码:

for line in response.body.splitlines():
    if line:
        line = map(int, line.split())
        opg, opc, value = line[2], line[3], line[5]
        if opg == 160 and opc == 129:
            ret['success'] = "valore: %s" % (value)
            self.write(tornado.escape.json_encode(ret))

答案 1 :(得分:2)

&是一个按位操作。你可能想要and。对于整数,你可能认为它不会产生影响

>>> True & False
False
>>> True & True
True
>>> False & False
False

但请注意,&anddifferent priorities

>>> opc,opg = 160,129
>>> opc == 160 & opg == 129
False
>>> opc == 160 and opg == 129
True

基本上,&==更紧密,因此a == b & c == d被解析为a == ( b & c) == d而不是(a == b) & (c == d)

>>> def func1():
...     opc,opg = 160,129
...     opc == 160 & opg == 129
... 
>>> def func2():
...     opc,opg = 160,129
...     opc == 160 and opg == 129
... 
>>> import dis
>>> dis.dis(func1)
  2           0 LOAD_CONST               3 ((160, 129))
              3 UNPACK_SEQUENCE          2
              6 STORE_FAST               0 (opc)
              9 STORE_FAST               1 (opg)

  3          12 LOAD_FAST                0 (opc)
             15 LOAD_CONST               1 (160)
             18 LOAD_FAST                1 (opg)
             21 BINARY_AND          
             22 DUP_TOP             
             23 ROT_THREE           
             24 COMPARE_OP               2 (==)
             27 JUMP_IF_FALSE_OR_POP    39
             30 LOAD_CONST               2 (129)
             33 COMPARE_OP               2 (==)
             36 JUMP_FORWARD             2 (to 41)
        >>   39 ROT_TWO             
             40 POP_TOP             
        >>   41 POP_TOP             
             42 LOAD_CONST               0 (None)
             45 RETURN_VALUE        
>>> dis.dis(func2)
  2           0 LOAD_CONST               3 ((160, 129))
              3 UNPACK_SEQUENCE          2
              6 STORE_FAST               0 (opc)
              9 STORE_FAST               1 (opg)

  3          12 LOAD_FAST                0 (opc)
             15 LOAD_CONST               1 (160)
             18 COMPARE_OP               2 (==)
             21 JUMP_IF_FALSE_OR_POP    33
             24 LOAD_FAST                1 (opg)
             27 LOAD_CONST               2 (129)
             30 COMPARE_OP               2 (==)
        >>   33 POP_TOP             
             34 LOAD_CONST               0 (None)
             37 RETURN_VALUE        

正如Hoopdady指出的那样,你也没有正确分裂你的弦乐。 line.split()line.split(None)将在连续的空白行中分割。

答案 2 :(得分:2)

只需使用line.split()代替line.split(" ")。这样它可以处理任何类型的空白。如果那些不仅仅是空格,你会得到一些奇怪的结果,这可能就是正在发生的事情。