19

これはばかげた質問かもしれませんが、演算子の関数へのマッピングを見て、演算子を表現する関数がないことに気付きましたnot in。最初は、これはおそらくインタープリターがこれを に並べ替えるためだと思いましたが、 とまったく同じように動作するように思われるnot x in y関数があります。何か足りないのですか、それともそのオペレーターは本当に存在しませんか?is notnot in

これが必要な場合の本当にばかげた例を次に示します。

def compare_iter(a,b,func):
    return [func(aa,bb) for aa,bb in zip(a,b)]

my_compare=compare_iter(xx,yy,lambda x,y:x not in y)  #lambda -- yuck
my_compare=map(operator.not_,compare_iter(xx,yy,operator.contains)  #extra map?  grr...
#it would be nice to do: my_compare=compare_iter(xx,yy,operator.not_contains)

もちろん、このために独自の関数を作成することもできますが、その場合、オペレーター モジュールがこのコードを python からプッシュして高速に実行できるのに対し、効率が犠牲になります。

4

2 に答える 2

15

ここでは別の関数は必要ありません。not inは の逆なinので、次のマッピングがあります。

obj in seq => contains(seq, obj)

obj not in seq => not contains(seq, obj)

同一性テストは対称でなければならないため、これはis/と一致しません。is notこれは設計上の成果物である可能性があります。

于 2012-07-11T14:48:53.983 に答える
4

次の関数と逆アセンブリは、演算子を理解するのに役立つ場合があります。

>>> def test():
        if 0 in (): pass
        if 0 not in (): pass
        if 0 is (): pass
        if 0 is not (): pass
        return None

>>> dis.dis(test)
  2           0 LOAD_CONST               1 (0) 
              3 LOAD_CONST               2 (()) 
              6 COMPARE_OP               6 (in) 
              9 POP_JUMP_IF_FALSE       15 
             12 JUMP_FORWARD             0 (to 15) 

  3     >>   15 LOAD_CONST               1 (0) 
             18 LOAD_CONST               3 (()) 
             21 COMPARE_OP               7 (not in) 
             24 POP_JUMP_IF_FALSE       30 
             27 JUMP_FORWARD             0 (to 30) 

  4     >>   30 LOAD_CONST               1 (0) 
             33 LOAD_CONST               4 (()) 
             36 COMPARE_OP               8 (is) 
             39 POP_JUMP_IF_FALSE       45 
             42 JUMP_FORWARD             0 (to 45) 

  5     >>   45 LOAD_CONST               1 (0) 
             48 LOAD_CONST               5 (()) 
             51 COMPARE_OP               9 (is not) 
             54 POP_JUMP_IF_FALSE       60 
             57 JUMP_FORWARD             0 (to 60) 

  6     >>   60 LOAD_CONST               0 (None) 
             63 RETURN_VALUE         
>>> 

ご覧のとおり、各演算子には違いがあります。それらのコードは (順番に) 6、7、8、および 9 です。

于 2012-07-11T15:34:58.637 に答える