4

大家好,我有这部分代码:

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 与 int 进行比较...

4

3 回答 3

6

您对运营商感到困惑;and是正确的布尔测试&而是二进制位运算符

if opg == 160 and opc == 129:

作为数字运算符,&运算符的优先级高于比较运算符,而布尔运算符的优先级较低。因此,该表达式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))
于 2013-03-06T15:19:32.767 回答
2

&是按位运算。你可能想要and. 使用整数,您可能不会认为它会有所作为

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

但是,请注意&and不同的优先级

>>> 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)将在连续运行的空白处拆分。

于 2013-03-06T15:19:36.247 回答
2

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

于 2013-03-06T15:23:23.940 回答