大家好我有这部分代码:
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答案 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
但请注意,&
和and
有different 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(" ")
。这样它可以处理任何类型的空白。如果那些不仅仅是空格,你会得到一些奇怪的结果,这可能就是正在发生的事情。