这可能是一个愚蠢的问题,但在查看the mapping of operators to functions时,我注意到没有函数来表示not in
运算符。起初,我认为这可能是因为解释器只是将其重新排序为not x in y
,但有一个用于is not
的函数,它的行为似乎应该与not 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中推出来,因此执行速度更快。
发布于 2012-07-11 22:48:54
这里不需要另一个函数。not in
与in
相反,因此您具有以下映射:
obj in seq => contains(seq, obj)
obj not in seq => not contains(seq, obj)
您是对的,这与is
/is not
不一致,因为身份测试应该是对称的。这可能是一个设计工件。
发布于 2012-07-11 23:34:59
您可能会发现以下函数和反汇编对理解运算符很有帮助:
>>> 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。
https://stackoverflow.com/questions/11435206
复制相似问题