当前位置: 首页 > 知识库问答 >
问题:

python运算符,没有用于“不在”的运算符

阴阳
2023-03-14

这可能是一个愚蠢的问题,但看看操作符到函数的映射,我注意到没有函数来表示而不是操作符。起初,我认为这可能是因为解释器只是将其重新排序为而不是y中的x,但是有一个函数用于不是,它的行为应该与不在中的行为完全相同。是我遗漏了什么,还是那个操作员真的不存在?

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

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中推出,因此执行速度更快。


共有2个答案

濮俊美
2023-03-14

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

>>> 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。

程胤运
2023-03-14
匿名用户

这里不需要另一个函数not in与中的相反,因此有以下映射:

obj in seq => contains(seq, obj)

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

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

 类似资料:
  • 问题内容: 我来自ac风格语言,因此我很自然地使用不相等的语言,但是当我使用Python时,从我阅读的文档中我了解到为此目的使用了运算符。 最近,我看到了很多使用的代码,所以我的问题是,其中之一比其他的更受青睐,还是其中之一被弃用了。 另外,我想知道它们之间是否有任何区别。 问题答案: 蟒2只支持 两个 ,在Python 3的操作者已被删除。 两者之间没有区别,但是是首选形式。

  • 问题内容: 我注意到我可以使用运算符比较所有本机数据类型(整数,字符串,布尔值,浮点数等),还可以比较包含本机数据类型的列表,元组,集合和字典。在这些情况下,操作员将检查两个对象是否相等。但是在某些其他情况下(试图比较我创建的类的实例),该运算符只是检查两个变量是否引用同一对象(因此在这些情况下,该运算符等效于该运算符) 我的问题是:什么时候操作员不只是比较身份? 编辑:我正在使用Python 3

  • 主要内容:+ 加法运算符,- 减法运算符,*乘法运算符,/ 和 // 除法运算符,% 求余运算符,** 次方(乘方)运算符算术运算符也即数学运算符,用来对数字进行数学运算,比如加减乘除。下表列出了 Python 支持所有基本算术运算符。 表 1 Python 常用算术运算符 运算符 说明 实例 结果 + 加 12.45 + 15 27.45 - 减 4.56 - 0.26 4.3 * 乘 5 * 3.6 18.0 / 除法(和数学中的规则一样) 7 / 2 3.5 // 整除(只保留商的整数部分

  • 实际上,三元运算符的语言示例中是否有一个内置的不是以下形式的(条件运算符)? 我不是在找一种特定的语言,虽然至少有中等程度的流行度会更好。

  • 问题内容: 有人可以解释一下SQL中的以下行为吗? 问题答案: 是标准SQL-92;是等效的。两者都评估值,但不是-是占位符,表示不存在值。 这就是为什么您只能在此类情况下使用/作为谓词的原因。 此行为不特定于SQL Server。所有符合标准的SQL方言都以相同的方式工作。 注意 :要比较如果您的 值不为null ,请使用,而要与 不为null 值进行比较,请使用。我不能说我的值是否等于NULL

  • 问题内容: 有两个不等于运算符-和。 它们之间有什么区别?我听说这比其他字符串比较有效。任何人都可以对此声明做出定性评论。 问题答案: 它们是相同的(与第三种形式一样)。 不过请注意,从解析器的角度来看,它们仍然被认为是不同的,这是为将不匹配或定义的存储轮廓。 这不像在解析器对待和还在分析阶段,所以你不能超载,并为不同的运营商。