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

3番目と4番目の要素がそれぞれ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 に答える