首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python运算符,没有"not in“运算符

python运算符,没有"not in“运算符
EN

Stack Overflow用户
提问于 2012-07-11 22:43:49
回答 2查看 6.7K关注 0票数 19

这可能是一个愚蠢的问题,但在查看the mapping of operators to functions时,我注意到没有函数来表示not in运算符。起初,我认为这可能是因为解释器只是将其重新排序为not x in y,但有一个用于is not的函数,它的行为似乎应该与not in完全相同。是我漏掉了什么,还是那个运算符真的不存在?

这里有一个非常愚蠢的例子,你可能需要这样做:

代码语言:javascript
复制
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中推出来,因此执行速度更快。

EN

回答 2

Stack Overflow用户

发布于 2012-07-11 22:48:54

这里不需要另一个函数。not inin相反,因此您具有以下映射:

代码语言:javascript
复制
obj in seq => contains(seq, obj)

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

您是对的,这与is/is not不一致,因为身份测试应该是对称的。这可能是一个设计工件。

票数 15
EN

Stack Overflow用户

发布于 2012-07-11 23:34:59

您可能会发现以下函数和反汇编对理解运算符很有帮助:

代码语言:javascript
复制
>>> 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。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11435206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档